Merge branch 'develop' into merge-2024.09-rc-branch

This commit is contained in:
Art4 2024-11-16 08:32:25 +00:00
commit eb04f3b079
25 changed files with 340 additions and 205 deletions

14
.phpstan.neon Normal file
View file

@ -0,0 +1,14 @@
# SPDX-FileCopyrightText: 2010 - 2024 the Friendica project
#
# SPDX-License-Identifier: CC0-1.0
parameters:
level: 0
paths:
- src/
scanDirectories:
- mod
- vendor
- view

View file

@ -152,13 +152,16 @@
"mikey179/vfsstream": "^1.6", "mikey179/vfsstream": "^1.6",
"mockery/mockery": "^1.3", "mockery/mockery": "^1.3",
"php-mock/php-mock-phpunit": "^2.10", "php-mock/php-mock-phpunit": "^2.10",
"phpstan/phpstan": "^2.0",
"phpunit/phpunit": "^9" "phpunit/phpunit": "^9"
}, },
"scripts": { "scripts": {
"test": "phpunit", "test": "phpunit",
"test:unit": "phpunit -c tests/phpunit.xml --testsuite unit", "test:unit": "phpunit -c tests/phpunit.xml --testsuite unit",
"phpstan": "phpstan analyze --memory-limit 1024M --configuration .phpstan.neon",
"lint": "find . -name \\*.php -not -path './vendor/*' -not -path './view/asset/*' -print0 | xargs -0 -n1 php -l", "lint": "find . -name \\*.php -not -path './vendor/*' -not -path './view/asset/*' -print0 | xargs -0 -n1 php -l",
"docker:translate": "docker run --rm -v $PWD:/data -w /data friendicaci/transifex bin/run_xgettext.sh", "docker:translate": "docker run --rm -v $PWD:/data -w /data friendicaci/transifex bin/run_xgettext.sh",
"lang:recreate": "bin/run_xgettext.sh",
"cs:install": "@composer install --working-dir=bin/dev/php-cs-fixer", "cs:install": "@composer install --working-dir=bin/dev/php-cs-fixer",
"cs:check": [ "cs:check": [
"@cs:install", "@cs:install",

60
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "d51158b9593011921144e90af146a86a", "content-hash": "3e31a2243fb69e47e1b7000cca946fa2",
"packages": [ "packages": [
{ {
"name": "asika/simple-console", "name": "asika/simple-console",
@ -4832,6 +4832,64 @@
], ],
"time": "2024-02-11T07:24:16+00:00" "time": "2024-02-11T07:24:16+00:00"
}, },
{
"name": "phpstan/phpstan",
"version": "2.0.1",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "ab4e9b4415a5fc9e4d27f7fe16c8bc9d067dcd6d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/ab4e9b4415a5fc9e4d27f7fe16c8bc9d067dcd6d",
"reference": "ab4e9b4415a5fc9e4d27f7fe16c8bc9d067dcd6d",
"shasum": ""
},
"require": {
"php": "^7.4|^8.0"
},
"conflict": {
"phpstan/phpstan-shim": "*"
},
"bin": [
"phpstan",
"phpstan.phar"
],
"type": "library",
"autoload": {
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHPStan - PHP Static Analysis Tool",
"keywords": [
"dev",
"static analysis"
],
"support": {
"docs": "https://phpstan.org/user-guide/getting-started",
"forum": "https://github.com/phpstan/phpstan/discussions",
"issues": "https://github.com/phpstan/phpstan/issues",
"security": "https://github.com/phpstan/phpstan/security/policy",
"source": "https://github.com/phpstan/phpstan-src"
},
"funding": [
{
"url": "https://github.com/ondrejmirtes",
"type": "github"
},
{
"url": "https://github.com/phpstan",
"type": "github"
}
],
"time": "2024-11-11T15:43:04+00:00"
},
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "9.2.31", "version": "9.2.31",

View file

@ -210,7 +210,7 @@ class Mode
public function isInstall(): bool public function isInstall(): bool
{ {
return !$this->has(Mode::LOCALCONFIGPRESENT) || return !$this->has(Mode::LOCALCONFIGPRESENT) ||
!$this->has(MODE::DBAVAILABLE); !$this->has(Mode::DBAVAILABLE);
} }
/** /**

View file

@ -89,7 +89,9 @@ class BaseCollection extends \ArrayIterator
*/ */
public function map(callable $callback): BaseCollection public function map(callable $callback): BaseCollection
{ {
return new static(array_map($callback, $this->getArrayCopy()), $this->getTotalCount()); $class = get_class($this);
return new $class(array_map($callback, $this->getArrayCopy()), $this->getTotalCount());
} }
/** /**
@ -102,7 +104,9 @@ class BaseCollection extends \ArrayIterator
*/ */
public function filter(callable $callback = null, int $flag = 0): BaseCollection public function filter(callable $callback = null, int $flag = 0): BaseCollection
{ {
return new static(array_filter($this->getArrayCopy(), $callback, $flag)); $class = get_class($this);
return new $class(array_filter($this->getArrayCopy(), $callback, $flag));
} }
/** /**
@ -112,7 +116,9 @@ class BaseCollection extends \ArrayIterator
*/ */
public function reverse(): BaseCollection public function reverse(): BaseCollection
{ {
return new static(array_reverse($this->getArrayCopy()), $this->getTotalCount()); $class = get_class($this);
return new $class(array_reverse($this->getArrayCopy()), $this->getTotalCount());
} }
/** /**
@ -128,7 +134,9 @@ class BaseCollection extends \ArrayIterator
} }
return array_map(function ($array) { return array_map(function ($array) {
return new static($array); $class = get_class($this);
return new $class($array);
}, array_chunk($this->getArrayCopy(), $length)); }, array_chunk($this->getArrayCopy(), $length));
} }

View file

@ -144,6 +144,8 @@ HELP;
} }
$this->out($table->getTable()); $this->out($table->getTable());
return 0;
} }
/** /**

View file

@ -8,6 +8,7 @@
namespace Friendica\Console; namespace Friendica\Console;
use Asika\SimpleConsole\Console; use Asika\SimpleConsole\Console;
use Exception;
use Friendica\App; use Friendica\App;
use Friendica\App\BaseURL; use Friendica\App\BaseURL;
use Friendica\Core\Config\Capability\IManageConfigValues; use Friendica\Core\Config\Capability\IManageConfigValues;
@ -54,12 +55,12 @@ Options
-d|--dbdata <database> The name of the mysql/mariadb database (env MYSQL_DATABASE) -d|--dbdata <database> The name of the mysql/mariadb database (env MYSQL_DATABASE)
-u|--dbuser <username> The username of the mysql/mariadb database login (env MYSQL_USER or MYSQL_USERNAME) -u|--dbuser <username> The username of the mysql/mariadb database login (env MYSQL_USER or MYSQL_USERNAME)
-P|--dbpass <password> The password of the mysql/mariadb database login (env MYSQL_PASSWORD) -P|--dbpass <password> The password of the mysql/mariadb database login (env MYSQL_PASSWORD)
-U|--url <url> The full base URL of Friendica - f.e. 'https://friendica.local/sub' (env FRIENDICA_URL) -U|--url <url> The full base URL of Friendica - f.e. 'https://friendica.local/sub' (env FRIENDICA_URL)
-B|--phppath <php_path> The path of the PHP binary (env FRIENDICA_PHP_PATH) -B|--phppath <php_path> The path of the PHP binary (env FRIENDICA_PHP_PATH)
-b|--basepath <base_path> The basepath of Friendica (env FRIENDICA_BASE_PATH) -b|--basepath <base_path> The basepath of Friendica (env FRIENDICA_BASE_PATH)
-t|--tz <timezone> The timezone of Friendica (env FRIENDICA_TZ) -t|--tz <timezone> The timezone of Friendica (env FRIENDICA_TZ)
-L|--lang <language> The language of Friendica (env FRIENDICA_LANG) -L|--lang <language> The language of Friendica (env FRIENDICA_LANG)
Environment variables Environment variables
MYSQL_HOST The host of the mysql/mariadb database (mandatory if mysql and environment is used) MYSQL_HOST The host of the mysql/mariadb database (mandatory if mysql and environment is used)
MYSQL_PORT The port of the mysql/mariadb database MYSQL_PORT The port of the mysql/mariadb database
@ -73,7 +74,7 @@ Environment variables
FRIENDICA_ADMIN_MAIL The admin email address of Friendica (this email will be used for admin access) FRIENDICA_ADMIN_MAIL The admin email address of Friendica (this email will be used for admin access)
FRIENDICA_TZ The timezone of Friendica FRIENDICA_TZ The timezone of Friendica
FRIENDICA_LANG The langauge of Friendica FRIENDICA_LANG The langauge of Friendica
Examples Examples
bin/console autoinstall -f 'input.config.php bin/console autoinstall -f 'input.config.php
Installs Friendica with the prepared 'input.config.php' file Installs Friendica with the prepared 'input.config.php' file

View file

@ -158,9 +158,10 @@ HELP;
if ($result['success']) { if ($result['success']) {
$this->out('User ' . $user['nickname'] . ' now connected to ' . $url . ', contact ID ' . $result['cid']); $this->out('User ' . $user['nickname'] . ' now connected to ' . $url . ', contact ID ' . $result['cid']);
} else { return true;
throw new RuntimeException($result['message']);
} }
throw new RuntimeException($result['message']);
} }
/** /**

View file

@ -7,12 +7,11 @@
namespace Friendica\Console; namespace Friendica\Console;
use Friendica\App; use Asika\SimpleConsole\CommandArgsException;
use Friendica\App\Mode;
use Friendica\Core\L10n;
use Friendica\Database\Database; use Friendica\Database\Database;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Contact; use Friendica\Model\Contact;
use Friendica\Util\Strings;
use RuntimeException; use RuntimeException;
/** /**
@ -23,13 +22,17 @@ class FixAPDeliveryWorkerTaskParameters extends \Asika\SimpleConsole\Console
protected $helpOptions = ['h', 'help', '?']; protected $helpOptions = ['h', 'help', '?'];
/** /**
* @var App\Mode * @var Mode
*/ */
private $appMode; private $appMode;
/** /**
* @var Database * @var Database
*/ */
private $dba; private $dba;
/**
* @var L10n
*/
private $l10n;
/** /**
* @var int * @var int
*/ */
@ -53,7 +56,7 @@ Usage
Description Description
During the 2020.12 RC period some worker task parameters have been corrupted, resulting in the impossibility to execute them. During the 2020.12 RC period some worker task parameters have been corrupted, resulting in the impossibility to execute them.
This command restores their expected parameters. This command restores their expected parameters.
If you didn't run Friendica during the 2020.12 RC period, you do not need to use this command. If you didn't run Friendica during the 2020.12 RC period, you do not need to use this command.
Options Options
-h|--help|-? Show help information -h|--help|-? Show help information
@ -62,7 +65,7 @@ HELP;
return $help; return $help;
} }
public function __construct(App\Mode $appMode, Database $dba, \Friendica\Core\L10n $l10n, array $argv = null) public function __construct(Mode $appMode, Database $dba, L10n $l10n, array $argv = null)
{ {
parent::__construct($argv); parent::__construct($argv);
@ -80,7 +83,7 @@ HELP;
} }
if (count($this->args) > 0) { if (count($this->args) > 0) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments'); throw new CommandArgsException('Too many arguments');
} }
if ($this->appMode->isInstall()) { if ($this->appMode->isInstall()) {

View file

@ -122,7 +122,7 @@ HELP;
case 'search': case 'search':
return $this->searchUser(); return $this->searchUser();
case 'config': case 'config':
return $this->configUser(); return ($this->configUser()) ? 0 : 1;
default: default:
throw new \Asika\SimpleConsole\CommandArgsException('Wrong command.'); throw new \Asika\SimpleConsole\CommandArgsException('Wrong command.');
} }
@ -512,5 +512,7 @@ HELP;
$this->out($this->getHelp()); $this->out($this->getHelp());
return false; return false;
} }
return true;
} }
} }

View file

@ -228,7 +228,7 @@ class PostMedia extends BaseEntity
$newHeight = $dimensionts['height']; $newHeight = $dimensionts['height'];
} }
return new static( return new self(
$this->uriId, $this->uriId,
$this->url, $this->url,
$this->type, $this->type,
@ -255,7 +255,7 @@ class PostMedia extends BaseEntity
public function withUrl(\GuzzleHttp\Psr7\Uri $url): self public function withUrl(\GuzzleHttp\Psr7\Uri $url): self
{ {
return new static( return new self(
$this->uriId, $this->uriId,
$url, $url,
$this->type, $this->type,

View file

@ -26,7 +26,6 @@ class ContactBlock
/** /**
* Get HTML for contact block * Get HTML for contact block
* *
* @template widget/contacts.tpl
* @hook contact_block_end (contacts=>array, output=>string) * @hook contact_block_end (contacts=>array, output=>string)
* @return string Formatted HTML code or empty string * @return string Formatted HTML code or empty string
*/ */

View file

@ -26,7 +26,6 @@ class VCard
/** /**
* Get HTML for vcard block * Get HTML for vcard block
* *
* @template widget/vcard.tpl
* @param array $contact * @param array $contact
* @param bool $hide_mention * @param bool $hide_mention
* @param bool $hide_follow * @param bool $hide_follow

View file

@ -41,11 +41,8 @@ class APCuCache extends AbstractCache implements ICanCacheInMemory
$ns = $this->getCacheKey($prefix ?? ''); $ns = $this->getCacheKey($prefix ?? '');
$ns = preg_quote($ns, '/'); $ns = preg_quote($ns, '/');
if (class_exists('\APCIterator')) { /** @phpstan-ignore-next-line see https://github.com/friendica/friendica-addons/pull/1363 */
$iterator = new \APCIterator('user', '/^' . $ns. '/', APC_ITER_KEY); $iterator = new \APCUIterator('/^' . $ns . '/', APC_ITER_KEY);
} else {
$iterator = new \APCUIterator('/^' . $ns . '/', APC_ITER_KEY);
}
$keys = []; $keys = [];
foreach ($iterator as $item) { foreach ($iterator as $item) {
@ -122,11 +119,8 @@ class APCuCache extends AbstractCache implements ICanCacheInMemory
$prefix = $this->getPrefix(); $prefix = $this->getPrefix();
$prefix = preg_quote($prefix, '/'); $prefix = preg_quote($prefix, '/');
if (class_exists('\APCIterator')) { /** @phpstan-ignore-next-line see https://github.com/friendica/friendica-addons/pull/1363 */
$iterator = new \APCIterator('user', '/^' . $prefix . '/', APC_ITER_KEY); $iterator = new \APCUIterator('/^' . $prefix . '/', APC_ITER_KEY);
} else {
$iterator = new \APCUIterator('/^' . $prefix . '/', APC_ITER_KEY);
}
return apcu_delete($iterator); return apcu_delete($iterator);
} }
@ -149,10 +143,7 @@ class APCuCache extends AbstractCache implements ICanCacheInMemory
return false; return false;
} elseif (!ini_get('apc.enabled') && !ini_get('apc.enable_cli')) { } elseif (!ini_get('apc.enabled') && !ini_get('apc.enable_cli')) {
return false; return false;
} elseif ( } elseif (version_compare(phpversion('apcu') ?: '0.0.0', '5.1.0', '<')) {
version_compare(phpversion('apc') ?: '0.0.0', '4.0.6') === -1 &&
version_compare(phpversion('apcu') ?: '0.0.0', '5.1.0') === -1
) {
return false; return false;
} }

View file

@ -2709,8 +2709,6 @@ class Contact
* *
* @param int $id * @param int $id
* @param array $contact * @param array $contact
*
* @return boolean
*/ */
private static function hasLocalData(int $id, array $contact): bool private static function hasLocalData(int $id, array $contact): bool
{ {
@ -2770,6 +2768,8 @@ class Contact
'network', 'alias', 'baseurl', 'gsid', 'forum', 'prv', 'contact-type', 'pubkey', 'last-item', 'xmpp', 'matrix', 'network', 'alias', 'baseurl', 'gsid', 'forum', 'prv', 'contact-type', 'pubkey', 'last-item', 'xmpp', 'matrix',
'created', 'last-update' 'created', 'last-update'
]; ];
/** @var array<string,mixed> */
$contact = DBA::selectFirst('contact', $fields, ['id' => $id]); $contact = DBA::selectFirst('contact', $fields, ['id' => $id]);
if (!DBA::isResult($contact)) { if (!DBA::isResult($contact)) {
return false; return false;
@ -2795,22 +2795,22 @@ class Contact
$has_local_data = self::hasLocalData($id, $contact); $has_local_data = self::hasLocalData($id, $contact);
$uid = $contact['uid']; $uid = $contact['uid'] ?? null;
unset($contact['uid']); unset($contact['uid']);
$uriid = $contact['uri-id']; $uriid = $contact['uri-id'] ?? null;
unset($contact['uri-id']); unset($contact['uri-id']);
$pubkey = $contact['pubkey']; $pubkey = $contact['pubkey'] ?? null;
unset($contact['pubkey']); unset($contact['pubkey']);
$created = $contact['created']; $created = $contact['created'] ?? '';
unset($contact['created']); unset($contact['created']);
$last_update = $contact['last-update']; $last_update = $contact['last-update'] ?? '';
unset($contact['last-update']); unset($contact['last-update']);
$contact['photo'] = $contact['avatar']; $contact['photo'] = $contact['avatar'] ?? null;
unset($contact['avatar']); unset($contact['avatar']);
$updated = DateTimeFormat::utcNow(); $updated = DateTimeFormat::utcNow();

View file

@ -3199,10 +3199,10 @@ class Item
} elseif ($remote_user) { } elseif ($remote_user) {
// Authenticated visitor - fetch the matching permissionsets // Authenticated visitor - fetch the matching permissionsets
$permissionSets = DI::permissionSet()->selectByContactId($remote_user, $owner_id); $permissionSets = DI::permissionSet()->selectByContactId($remote_user, $owner_id);
if (!empty($set)) { if (!empty($permissionSets)) {
$condition = [ $condition = [
"(`private` != ? OR (`private` = ? AND `wall` "(`private` != ? OR (`private` = ? AND `wall`
AND `psid` IN (" . implode(', ', array_fill(0, count($set), '?')) . ")))", AND `psid` IN (" . implode(', ', array_fill(0, count($permissionSets), '?')) . ")))",
self::PRIVATE, self::PRIVATE self::PRIVATE, self::PRIVATE
]; ];
$condition = array_merge($condition, $permissionSets->column('id')); $condition = array_merge($condition, $permissionSets->column('id'));
@ -3248,7 +3248,7 @@ class Item
*/ */
$permissionSets = DI::permissionSet()->selectByContactId($remote_user, $owner_id); $permissionSets = DI::permissionSet()->selectByContactId($remote_user, $owner_id);
if (!empty($set)) { if (!empty($permissionSets)) {
$sql_set = sprintf(" OR (" . $table . "`private` = %d AND " . $table . "`wall` AND " . $table . "`psid` IN (", self::PRIVATE) . implode(',', $permissionSets->column('id')) . "))"; $sql_set = sprintf(" OR (" . $table . "`private` = %d AND " . $table . "`wall` AND " . $table . "`psid` IN (", self::PRIVATE) . implode(',', $permissionSets->column('id')) . "))";
} else { } else {
$sql_set = ''; $sql_set = '';

View file

@ -157,10 +157,6 @@ class Search extends BaseApi
$condition = DBA::mergeConditions($condition, ["`uri-id` < ?", $max_id]); $condition = DBA::mergeConditions($condition, ["`uri-id` < ?", $max_id]);
} }
if (!empty($since_id)) {
$condition = DBA::mergeConditions($condition, ["`uri-id` > ?", $since_id]);
}
if (!empty($min_id)) { if (!empty($min_id)) {
$condition = DBA::mergeConditions($condition, ["`uri-id` > ?", $min_id]); $condition = DBA::mergeConditions($condition, ["`uri-id` > ?", $min_id]);

View file

@ -23,12 +23,12 @@ class ActivityPubConversion extends BaseModule
protected function content(array $request = []): string protected function content(array $request = []): string
{ {
function visible_whitespace($s)
{
return '<pre>' . htmlspecialchars($s) . '</pre>';
}
$results = []; $results = [];
$visible_whitespace = function (string $s): string {
return '<pre>' . htmlspecialchars($s) . '</pre>';
};
if (!empty($_REQUEST['source'])) { if (!empty($_REQUEST['source'])) {
try { try {
$source = json_decode($_REQUEST['source'], true); $source = json_decode($_REQUEST['source'], true);
@ -43,11 +43,11 @@ class ActivityPubConversion extends BaseModule
$formatted = json_encode($source, JSON_PRETTY_PRINT); $formatted = json_encode($source, JSON_PRETTY_PRINT);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Formatted'), 'title' => DI::l10n()->t('Formatted'),
'content' => visible_whitespace(trim(var_export($formatted, true), "'")), 'content' => $visible_whitespace(trim(var_export($formatted, true), "'")),
]; ];
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Source'), 'title' => DI::l10n()->t('Source'),
'content' => visible_whitespace(var_export($source, true)) 'content' => $visible_whitespace(var_export($source, true))
]; ];
$activity = JsonLD::compact($source); $activity = JsonLD::compact($source);
if (!$activity) { if (!$activity) {
@ -55,7 +55,7 @@ class ActivityPubConversion extends BaseModule
} }
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Activity'), 'title' => DI::l10n()->t('Activity'),
'content' => visible_whitespace(var_export($activity, true)) 'content' => $visible_whitespace(var_export($activity, true))
]; ];
$type = JsonLD::fetchElement($activity, '@type'); $type = JsonLD::fetchElement($activity, '@type');
@ -92,10 +92,6 @@ class ActivityPubConversion extends BaseModule
throw new \Exception('No trust for activity type "' . $type . '", so we quit now.'); throw new \Exception('No trust for activity type "' . $type . '", so we quit now.');
} }
if (!empty($body) && empty($object_data['raw'])) {
$object_data['raw'] = $body;
}
// Internal flag for thread completion. See Processor.php // Internal flag for thread completion. See Processor.php
if (!empty($activity['thread-completion'])) { if (!empty($activity['thread-completion'])) {
$object_data['thread-completion'] = $activity['thread-completion']; $object_data['thread-completion'] = $activity['thread-completion'];
@ -107,14 +103,14 @@ class ActivityPubConversion extends BaseModule
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Object data'), 'title' => DI::l10n()->t('Object data'),
'content' => visible_whitespace(var_export($object_data, true)) 'content' => $visible_whitespace(var_export($object_data, true))
]; ];
$item = ActivityPub\Processor::createItem($object_data, true); $item = ActivityPub\Processor::createItem($object_data, true);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Result Item'), 'title' => DI::l10n()->t('Result Item'),
'content' => visible_whitespace(var_export($item, true)) 'content' => $visible_whitespace(var_export($item, true))
]; ];
} catch (\Throwable $e) { } catch (\Throwable $e) {
$results[] = [ $results[] = [

View file

@ -29,12 +29,12 @@ class Babel extends BaseModule
protected function content(array $request = []): string protected function content(array $request = []): string
{ {
function visible_whitespace($s)
{
return '<pre>' . htmlspecialchars($s) . '</pre>';
}
$results = []; $results = [];
$visible_whitespace = function (string $s): string {
return '<pre>' . htmlspecialchars($s) . '</pre>';
};
if (!empty($request['text'])) { if (!empty($request['text'])) {
self::checkFormSecurityTokenForbiddenOnError('babel'); self::checkFormSecurityTokenForbiddenOnError('babel');
switch (($request['type'] ?? '') ?: 'bbcode') { switch (($request['type'] ?? '') ?: 'bbcode') {
@ -42,24 +42,24 @@ class Babel extends BaseModule
$bbcode = $request['text']; $bbcode = $request['text'];
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Source input'), 'title' => DI::l10n()->t('Source input'),
'content' => visible_whitespace($bbcode) 'content' => $visible_whitespace($bbcode)
]; ];
$plain = Text\BBCode::toPlaintext($bbcode, false); $plain = Text\BBCode::toPlaintext($bbcode, false);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('BBCode::toPlaintext'), 'title' => DI::l10n()->t('BBCode::toPlaintext'),
'content' => visible_whitespace($plain) 'content' => $visible_whitespace($plain)
]; ];
$html = Text\BBCode::convertForUriId(0, $bbcode); $html = Text\BBCode::convertForUriId(0, $bbcode);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('BBCode::convert (raw HTML)'), 'title' => DI::l10n()->t('BBCode::convert (raw HTML)'),
'content' => visible_whitespace($html) 'content' => $visible_whitespace($html)
]; ];
$results[] = [ $results[] = [
'title' => DI::l10n()->t('BBCode::convert (hex)'), 'title' => DI::l10n()->t('BBCode::convert (hex)'),
'content' => visible_whitespace(bin2hex($html)), 'content' => $visible_whitespace(bin2hex($html)),
]; ];
$results[] = [ $results[] = [
@ -70,19 +70,19 @@ class Babel extends BaseModule
$bbcode2 = Text\HTML::toBBCode($html); $bbcode2 = Text\HTML::toBBCode($html);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('BBCode::convert => HTML::toBBCode'), 'title' => DI::l10n()->t('BBCode::convert => HTML::toBBCode'),
'content' => visible_whitespace($bbcode2) 'content' => $visible_whitespace($bbcode2)
]; ];
$markdown = Text\BBCode::toMarkdown($bbcode); $markdown = Text\BBCode::toMarkdown($bbcode);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('BBCode::toMarkdown'), 'title' => DI::l10n()->t('BBCode::toMarkdown'),
'content' => visible_whitespace($markdown) 'content' => $visible_whitespace($markdown)
]; ];
$html2 = Text\Markdown::convert($markdown); $html2 = Text\Markdown::convert($markdown);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('BBCode::toMarkdown => Markdown::convert (raw HTML)'), 'title' => DI::l10n()->t('BBCode::toMarkdown => Markdown::convert (raw HTML)'),
'content' => visible_whitespace($html2) 'content' => $visible_whitespace($html2)
]; ];
$results[] = [ $results[] = [
'title' => DI::l10n()->t('BBCode::toMarkdown => Markdown::convert'), 'title' => DI::l10n()->t('BBCode::toMarkdown => Markdown::convert'),
@ -92,13 +92,13 @@ class Babel extends BaseModule
$bbcode3 = Text\Markdown::toBBCode($markdown); $bbcode3 = Text\Markdown::toBBCode($markdown);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('BBCode::toMarkdown => Markdown::toBBCode'), 'title' => DI::l10n()->t('BBCode::toMarkdown => Markdown::toBBCode'),
'content' => visible_whitespace($bbcode3) 'content' => $visible_whitespace($bbcode3)
]; ];
$bbcode4 = Text\HTML::toBBCode($html2); $bbcode4 = Text\HTML::toBBCode($html2);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('BBCode::toMarkdown => Markdown::convert => HTML::toBBCode'), 'title' => DI::l10n()->t('BBCode::toMarkdown => Markdown::convert => HTML::toBBCode'),
'content' => visible_whitespace($bbcode4) 'content' => $visible_whitespace($bbcode4)
]; ];
$tags = Text\BBCode::getTags($bbcode); $tags = Text\BBCode::getTags($bbcode);
@ -106,22 +106,22 @@ class Babel extends BaseModule
$body = Item::setHashtags($bbcode); $body = Item::setHashtags($bbcode);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Item Body'), 'title' => DI::l10n()->t('Item Body'),
'content' => visible_whitespace($body) 'content' => $visible_whitespace($body)
]; ];
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Item Tags'), 'title' => DI::l10n()->t('Item Tags'),
'content' => visible_whitespace(var_export($tags, true)), 'content' => $visible_whitespace(var_export($tags, true)),
]; ];
$body2 = PageInfo::searchAndAppendToBody($bbcode, true); $body2 = PageInfo::searchAndAppendToBody($bbcode, true);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('PageInfo::appendToBody'), 'title' => DI::l10n()->t('PageInfo::appendToBody'),
'content' => visible_whitespace($body2) 'content' => $visible_whitespace($body2)
]; ];
$html3 = Text\BBCode::convertForUriId(0, $body2); $html3 = Text\BBCode::convertForUriId(0, $body2);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('PageInfo::appendToBody => BBCode::convert (raw HTML)'), 'title' => DI::l10n()->t('PageInfo::appendToBody => BBCode::convert (raw HTML)'),
'content' => visible_whitespace($html3) 'content' => $visible_whitespace($html3)
]; ];
$results[] = [ $results[] = [
'title' => DI::l10n()->t('PageInfo::appendToBody => BBCode::convert'), 'title' => DI::l10n()->t('PageInfo::appendToBody => BBCode::convert'),
@ -132,7 +132,7 @@ class Babel extends BaseModule
$diaspora = trim($request['text']); $diaspora = trim($request['text']);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Source input (Diaspora format)'), 'title' => DI::l10n()->t('Source input (Diaspora format)'),
'content' => visible_whitespace($diaspora), 'content' => $visible_whitespace($diaspora),
]; ];
$markdown = XML::unescape($diaspora); $markdown = XML::unescape($diaspora);
@ -141,13 +141,13 @@ class Babel extends BaseModule
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Source input (Markdown)'), 'title' => DI::l10n()->t('Source input (Markdown)'),
'content' => visible_whitespace($markdown), 'content' => $visible_whitespace($markdown),
]; ];
$html = Text\Markdown::convert($markdown); $html = Text\Markdown::convert($markdown);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Markdown::convert (raw HTML)'), 'title' => DI::l10n()->t('Markdown::convert (raw HTML)'),
'content' => visible_whitespace($html), 'content' => $visible_whitespace($html),
]; ];
$results[] = [ $results[] = [
@ -158,14 +158,14 @@ class Babel extends BaseModule
$bbcode = Text\Markdown::toBBCode($markdown); $bbcode = Text\Markdown::toBBCode($markdown);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Markdown::toBBCode'), 'title' => DI::l10n()->t('Markdown::toBBCode'),
'content' => visible_whitespace($bbcode), 'content' => $visible_whitespace($bbcode),
]; ];
break; break;
case 'html' : case 'html' :
$html = trim($request['text']); $html = trim($request['text']);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Raw HTML input'), 'title' => DI::l10n()->t('Raw HTML input'),
'content' => visible_whitespace($html), 'content' => $visible_whitespace($html),
]; ];
$results[] = [ $results[] = [
@ -177,12 +177,12 @@ class Babel extends BaseModule
$results[] = [ $results[] = [
'title' => DI::l10n()->t('HTML Purified (raw)'), 'title' => DI::l10n()->t('HTML Purified (raw)'),
'content' => visible_whitespace($purified), 'content' => $visible_whitespace($purified),
]; ];
$results[] = [ $results[] = [
'title' => DI::l10n()->t('HTML Purified (hex)'), 'title' => DI::l10n()->t('HTML Purified (hex)'),
'content' => visible_whitespace(bin2hex($purified)), 'content' => $visible_whitespace(bin2hex($purified)),
]; ];
$results[] = [ $results[] = [
@ -193,7 +193,7 @@ class Babel extends BaseModule
$bbcode = Text\HTML::toBBCode($html); $bbcode = Text\HTML::toBBCode($html);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('HTML::toBBCode'), 'title' => DI::l10n()->t('HTML::toBBCode'),
'content' => visible_whitespace($bbcode) 'content' => $visible_whitespace($bbcode)
]; ];
$html2 = Text\BBCode::convertForUriId(0, $bbcode); $html2 = Text\BBCode::convertForUriId(0, $bbcode);
@ -210,25 +210,25 @@ class Babel extends BaseModule
$bbcode2plain = Text\BBCode::toPlaintext($bbcode); $bbcode2plain = Text\BBCode::toPlaintext($bbcode);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('HTML::toBBCode => BBCode::toPlaintext'), 'title' => DI::l10n()->t('HTML::toBBCode => BBCode::toPlaintext'),
'content' => visible_whitespace($bbcode2plain), 'content' => $visible_whitespace($bbcode2plain),
]; ];
$markdown = Text\HTML::toMarkdown($html); $markdown = Text\HTML::toMarkdown($html);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('HTML::toMarkdown'), 'title' => DI::l10n()->t('HTML::toMarkdown'),
'content' => visible_whitespace($markdown) 'content' => $visible_whitespace($markdown)
]; ];
$text = Text\HTML::toPlaintext($html, 0); $text = Text\HTML::toPlaintext($html, 0);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('HTML::toPlaintext'), 'title' => DI::l10n()->t('HTML::toPlaintext'),
'content' => visible_whitespace($text), 'content' => $visible_whitespace($text),
]; ];
$text = Text\HTML::toPlaintext($html, 0, true); $text = Text\HTML::toPlaintext($html, 0, true);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('HTML::toPlaintext (compact)'), 'title' => DI::l10n()->t('HTML::toPlaintext (compact)'),
'content' => visible_whitespace($text), 'content' => $visible_whitespace($text),
]; ];
break; break;
case 'twitter': case 'twitter':
@ -237,16 +237,11 @@ class Babel extends BaseModule
if (file_exists('addon/twitter/twitter.php')) { if (file_exists('addon/twitter/twitter.php')) {
require_once 'addon/twitter/twitter.php'; require_once 'addon/twitter/twitter.php';
if (parse_url($json) !== false) { $status = json_decode($json);
preg_match('#^https?://(?:mobile\.|www\.)?twitter.com/[^/]+/status/(\d+).*#', $json, $matches);
$status = twitter_statuses_show($matches[1]);
} else {
$status = json_decode($json);
}
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Decoded post'), 'title' => DI::l10n()->t('Decoded post'),
'content' => visible_whitespace(var_export($status, true)), 'content' => $visible_whitespace(var_export($status, true)),
]; ];
$postarray = []; $postarray = [];
@ -263,23 +258,9 @@ class Babel extends BaseModule
$postarray['object-type'] = Activity\ObjectType::BOOKMARK; $postarray['object-type'] = Activity\ObjectType::BOOKMARK;
} }
$picture = \twitter_media_entities($status, $postarray);
$results[] = [ $results[] = [
'title' => DI::l10n()->t('Post array before expand entities'), 'title' => DI::l10n()->t('Post array before expand entities'),
'content' => visible_whitespace(var_export($postarray, true)), 'content' => $visible_whitespace(var_export($postarray, true)),
];
$converted = \twitter_expand_entities($postarray['body'], $status, $picture);
$results[] = [
'title' => DI::l10n()->t('Post converted'),
'content' => visible_whitespace(var_export($converted, true)),
];
$results[] = [
'title' => DI::l10n()->t('Converted body'),
'content' => visible_whitespace($converted['body']),
]; ];
} else { } else {
$results[] = [ $results[] = [

View file

@ -11,36 +11,43 @@ use Friendica\BaseModule;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\DI; use Friendica\DI;
use Friendica\Model\Post; use Friendica\Model\Post;
use Friendica\Network\HTTPException; use Friendica\Network\HTTPException\NotFoundException;
use Friendica\Network\HTTPException\UnauthorizedException;
/** /**
* Print the body of an Item * Print the body of an Item
*/ */
class ItemBody extends BaseModule class ItemBody extends BaseModule
{ {
/**
* @throws NotFoundException|UnauthorizedException
*
* @return string|never
*/
protected function content(array $request = []): string protected function content(array $request = []): string
{ {
if (!DI::userSession()->getLocalUserId()) { if (!DI::userSession()->getLocalUserId()) {
throw new HTTPException\UnauthorizedException(DI::l10n()->t('Access denied.')); throw new UnauthorizedException(DI::l10n()->t('Access denied.'));
} }
if (empty($this->parameters['item'])) { if (empty($this->parameters['item'])) {
throw new HTTPException\NotFoundException(DI::l10n()->t('Item not found.')); throw new NotFoundException(DI::l10n()->t('Item not found.'));
} }
$itemId = intval($this->parameters['item']); $itemId = intval($this->parameters['item']);
$item = Post::selectFirst(['body'], ['uid' => [0, DI::userSession()->getLocalUserId()], 'uri-id' => $itemId]); $item = Post::selectFirst(['body'], ['uid' => [0, DI::userSession()->getLocalUserId()], 'uri-id' => $itemId]);
if (!empty($item)) { if (empty($item)) {
if (DI::mode()->isAjax()) { throw new NotFoundException(DI::l10n()->t('Item not found.'));
echo str_replace("\n", '<br />', $item['body']);
System::exit();
} else {
return str_replace("\n", '<br />', $item['body']);
}
} else {
throw new HTTPException\NotFoundException(DI::l10n()->t('Item not found.'));
} }
// TODO: Extract this code into controller
if (DI::mode()->isAjax()) {
echo str_replace("\n", '<br />', $item['body']);
System::exit();
}
return str_replace("\n", '<br />', $item['body']);
} }
} }

View file

@ -17,16 +17,30 @@ use Friendica\BaseDataTransferObject;
*/ */
class Preferences extends BaseDataTransferObject class Preferences extends BaseDataTransferObject
{ {
// /** @var string (Enumerable, oneOf) */ /**
// protected $posting_default_visibility; * @var string (Enumerable, oneOf)
// /** @var bool */ */
// protected $posting_default_sensitive; private $visibility;
// /** @var string (ISO 639-1 language two-letter code), or null*/
// protected $posting_default_language; /**
// /** @var string (Enumerable, oneOf) */ * @var bool
// protected $reading_expand_media; */
// /** @var bool */ private $sensitive;
// protected $reading_expand_spoilers;
/**
* @var string (ISO 639-1 language two-letter code), or null
*/
private $language;
/**
* @var string (Enumerable, oneOf)
*/
private $media;
/**
* @var bool
*/
private $spoilers;
/** /**
* Creates a preferences record. * Creates a preferences record.
@ -39,10 +53,26 @@ class Preferences extends BaseDataTransferObject
*/ */
public function __construct(string $visibility, bool $sensitive, string $language, string $media, bool $spoilers) public function __construct(string $visibility, bool $sensitive, string $language, string $media, bool $spoilers)
{ {
$this->{'posting:default:visibility'} = $visibility; $this->visibility = $visibility;
$this->{'posting:default:sensitive'} = $sensitive; $this->sensitive = $sensitive;
$this->{'posting:default:language'} = $language; $this->language = $language;
$this->{'reading:expand:media'} = $media; $this->media = $media;
$this->{'reading:expand:spoilers'} = $spoilers; $this->spoilers = $spoilers;
}
/**
* Returns the current entity as an array
*
* @return array
*/
public function toArray(): array
{
return [
'posting:default:visibility' => $this->visibility,
'posting:default:sensitive' => $this->sensitive,
'posting:default:language' => $this->language,
'reading:expand:media' => $this->media,
'reading:expand:spoilers' => $this->spoilers,
];
} }
} }

View file

@ -1880,25 +1880,29 @@ class Receiver
$object_data = self::getObjectDataFromActivity($object); $object_data = self::getObjectDataFromActivity($object);
$receiverdata = self::getReceivers($object, $actor ?: $object_data['actor'] ?? '', $object_data['tags'], true, false);
$receivers = $reception_types = [];
foreach ($receiverdata as $key => $data) {
$receivers[$key] = $data['uid'];
$reception_types[$data['uid']] = $data['type'] ?? 0;
}
$object_data['receiver_urls'] = self::getReceiverURL($object); $object_data['receiver_urls'] = self::getReceiverURL($object);
$object_data['receiver'] = $receivers; $object_data['receiver'] = [];
$object_data['reception_type'] = $reception_types; $object_data['reception_type'] = [];
$object_data['unlisted'] = false;
$receiverdata = self::getReceivers($object, $actor ?: $object_data['actor'] ?? '', $object_data['tags'], true, false);
foreach ($receiverdata as $key => $data) {
if ($data['uid'] !== -1) {
$object_data['reception_type'][$data['uid']] = $data['type'] ?? 0;
}
if ($key !== -1) {
$object_data['receiver'][$key] = $data['uid'];
} else {
$object_data['unlisted'] = true;
}
}
if (!empty($object['pixelfed:capabilities'])) { if (!empty($object['pixelfed:capabilities'])) {
$object_data['capabilities'] = self::getCapabilities($object); $object_data['capabilities'] = self::getCapabilities($object);
} }
$object_data['unlisted'] = in_array(-1, $object_data['receiver']);
unset($object_data['receiver'][-1]);
unset($object_data['reception_type'][-1]);
return $object_data; return $object_data;
} }

View file

@ -359,6 +359,8 @@ class Temporal
return sprintf($format, $r, (($r == 1) ? $str[0] : $str[1])); return sprintf($format, $r, (($r == 1) ? $str[0] : $str[1]));
} }
} }
return '';
} }
/** /**

View file

@ -0,0 +1,46 @@
<?php
// Copyright (C) 2010-2024, the Friendica project
// SPDX-FileCopyrightText: 2010-2024 the Friendica project
//
// SPDX-License-Identifier: AGPL-3.0-or-later
namespace Friendica\Test\Unit\Object\Api\Mastodon;
use Friendica\Object\Api\Mastodon\Preferences;
use PHPUnit\Framework\TestCase;
class PreferencesTest extends TestCase
{
public function testToArrayReturnsArray(): void
{
$preferences = new Preferences('visibility', true, 'language', 'media', false);
self::assertSame(
[
'posting:default:visibility' => 'visibility',
'posting:default:sensitive' => true,
'posting:default:language' => 'language',
'reading:expand:media' => 'media',
'reading:expand:spoilers' => false,
],
$preferences->toArray(),
);
}
public function testJsonSerializeReturnsArray(): void
{
$preferences = new Preferences('visibility', true, 'language', 'media', false);
self::assertSame(
[
'posting:default:visibility' => 'visibility',
'posting:default:sensitive' => true,
'posting:default:language' => 'language',
'reading:expand:media' => 'media',
'reading:expand:spoilers' => false,
],
$preferences->jsonSerialize(),
);
}
}

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 2024.09-rc\n" "Project-Id-Version: 2024.09-rc\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-11-15 06:54+0000\n" "POT-Creation-Date: 2024-11-16 08:31+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -39,8 +39,8 @@ msgid "Empty post discarded."
msgstr "" msgstr ""
#: mod/item.php:425 src/Module/Admin/Themes/Details.php:31 #: mod/item.php:425 src/Module/Admin/Themes/Details.php:31
#: src/Module/Admin/Themes/Index.php:51 src/Module/Debug/ItemBody.php:28 #: src/Module/Admin/Themes/Index.php:51 src/Module/Debug/ItemBody.php:34
#: src/Module/Debug/ItemBody.php:43 src/Module/Item/Feed.php:66 #: src/Module/Debug/ItemBody.php:42 src/Module/Item/Feed.php:66
msgid "Item not found." msgid "Item not found."
msgstr "" msgstr ""
@ -292,8 +292,8 @@ msgstr ""
#: mod/photos.php:1152 mod/photos.php:1232 #: mod/photos.php:1152 mod/photos.php:1232
#: src/Module/Calendar/Event/Form.php:236 src/Module/Contact/Advanced.php:118 #: src/Module/Calendar/Event/Form.php:236 src/Module/Contact/Advanced.php:118
#: src/Module/Contact/Profile.php:376 #: src/Module/Contact/Profile.php:376
#: src/Module/Debug/ActivityPubConversion.php:132 #: src/Module/Debug/ActivityPubConversion.php:128
#: src/Module/Debug/Babel.php:307 src/Module/Debug/Localtime.php:50 #: src/Module/Debug/Babel.php:288 src/Module/Debug/Localtime.php:50
#: src/Module/Debug/Probe.php:40 src/Module/Debug/WebFinger.php:37 #: src/Module/Debug/Probe.php:40 src/Module/Debug/WebFinger.php:37
#: src/Module/FriendSuggest.php:131 src/Module/Install.php:221 #: src/Module/FriendSuggest.php:131 src/Module/Install.php:221
#: src/Module/Install.php:261 src/Module/Install.php:296 #: src/Module/Install.php:261 src/Module/Install.php:296
@ -792,15 +792,15 @@ msgstr ""
msgid "Common" msgid "Common"
msgstr "" msgstr ""
#: src/Console/Addon.php:161 src/Console/Addon.php:185 #: src/Console/Addon.php:163 src/Console/Addon.php:187
msgid "Addon not found" msgid "Addon not found"
msgstr "" msgstr ""
#: src/Console/Addon.php:165 #: src/Console/Addon.php:167
msgid "Addon already enabled" msgid "Addon already enabled"
msgstr "" msgstr ""
#: src/Console/Addon.php:189 #: src/Console/Addon.php:191
msgid "Addon already disabled" msgid "Addon already disabled"
msgstr "" msgstr ""
@ -1065,7 +1065,7 @@ msgstr ""
msgid "Email" msgid "Email"
msgstr "" msgstr ""
#: src/Content/ContactSelector.php:122 src/Module/Debug/Babel.php:301 #: src/Content/ContactSelector.php:122 src/Module/Debug/Babel.php:282
msgid "Diaspora" msgid "Diaspora"
msgstr "" msgstr ""
@ -1365,7 +1365,7 @@ msgstr ""
msgid "Public post" msgid "Public post"
msgstr "" msgstr ""
#: src/Content/Conversation.php:410 src/Content/Widget/VCard.php:122 #: src/Content/Conversation.php:410 src/Content/Widget/VCard.php:121
#: src/Model/Profile.php:462 src/Module/Admin/Logs/View.php:80 #: src/Model/Profile.php:462 src/Module/Admin/Logs/View.php:80
#: src/Module/Post/Edit.php:167 #: src/Module/Post/Edit.php:167
msgid "Message" msgid "Message"
@ -2273,7 +2273,7 @@ msgstr ""
msgid "The end" msgid "The end"
msgstr "" msgstr ""
#: src/Content/Text/HTML.php:847 src/Content/Widget/VCard.php:118 #: src/Content/Text/HTML.php:847 src/Content/Widget/VCard.php:117
#: src/Model/Profile.php:456 src/Module/Contact/Profile.php:484 #: src/Model/Profile.php:456 src/Module/Contact/Profile.php:484
msgid "Follow" msgid "Follow"
msgstr "" msgstr ""
@ -2416,18 +2416,18 @@ msgstr ""
msgid "Export calendar as csv" msgid "Export calendar as csv"
msgstr "" msgstr ""
#: src/Content/Widget/ContactBlock.php:65 #: src/Content/Widget/ContactBlock.php:64
msgid "No contacts" msgid "No contacts"
msgstr "" msgstr ""
#: src/Content/Widget/ContactBlock.php:96 #: src/Content/Widget/ContactBlock.php:95
#, php-format #, php-format
msgid "%d Contact" msgid "%d Contact"
msgid_plural "%d Contacts" msgid_plural "%d Contacts"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Content/Widget/ContactBlock.php:113 #: src/Content/Widget/ContactBlock.php:112
msgid "View Contacts" msgid "View Contacts"
msgstr "" msgstr ""
@ -2446,27 +2446,27 @@ msgstr[1] ""
msgid "More Trending Tags" msgid "More Trending Tags"
msgstr "" msgstr ""
#: src/Content/Widget/VCard.php:96 src/Model/Contact.php:1207 #: src/Content/Widget/VCard.php:95 src/Model/Contact.php:1207
#: src/Model/Profile.php:441 #: src/Model/Profile.php:441
msgid "Post to group" msgid "Post to group"
msgstr "" msgstr ""
#: src/Content/Widget/VCard.php:101 src/Model/Contact.php:1211 #: src/Content/Widget/VCard.php:100 src/Model/Contact.php:1211
#: src/Model/Profile.php:445 src/Module/Moderation/Item/Source.php:77 #: src/Model/Profile.php:445 src/Module/Moderation/Item/Source.php:77
msgid "Mention" msgid "Mention"
msgstr "" msgstr ""
#: src/Content/Widget/VCard.php:111 src/Model/Profile.php:360 #: src/Content/Widget/VCard.php:110 src/Model/Profile.php:360
#: src/Module/Contact/Profile.php:420 src/Module/Profile/Profile.php:187 #: src/Module/Contact/Profile.php:420 src/Module/Profile/Profile.php:187
msgid "XMPP:" msgid "XMPP:"
msgstr "" msgstr ""
#: src/Content/Widget/VCard.php:112 src/Model/Profile.php:361 #: src/Content/Widget/VCard.php:111 src/Model/Profile.php:361
#: src/Module/Contact/Profile.php:422 src/Module/Profile/Profile.php:191 #: src/Module/Contact/Profile.php:422 src/Module/Profile/Profile.php:191
msgid "Matrix:" msgid "Matrix:"
msgstr "" msgstr ""
#: src/Content/Widget/VCard.php:113 src/Model/Event.php:68 #: src/Content/Widget/VCard.php:112 src/Model/Event.php:68
#: src/Model/Event.php:95 src/Model/Event.php:457 src/Model/Event.php:946 #: src/Model/Event.php:95 src/Model/Event.php:457 src/Model/Event.php:946
#: src/Model/Profile.php:355 src/Module/Contact/Profile.php:418 #: src/Model/Profile.php:355 src/Module/Contact/Profile.php:418
#: src/Module/Directory.php:134 src/Module/Notifications/Introductions.php:180 #: src/Module/Directory.php:134 src/Module/Notifications/Introductions.php:180
@ -2474,18 +2474,18 @@ msgstr ""
msgid "Location:" msgid "Location:"
msgstr "" msgstr ""
#: src/Content/Widget/VCard.php:116 src/Model/Profile.php:469 #: src/Content/Widget/VCard.php:115 src/Model/Profile.php:469
#: src/Module/Notifications/Introductions.php:194 #: src/Module/Notifications/Introductions.php:194
msgid "Network:" msgid "Network:"
msgstr "" msgstr ""
#: src/Content/Widget/VCard.php:120 src/Model/Contact.php:1239 #: src/Content/Widget/VCard.php:119 src/Model/Contact.php:1239
#: src/Model/Contact.php:1251 src/Model/Profile.php:458 #: src/Model/Contact.php:1251 src/Model/Profile.php:458
#: src/Module/Contact/Profile.php:476 #: src/Module/Contact/Profile.php:476
msgid "Unfollow" msgid "Unfollow"
msgstr "" msgstr ""
#: src/Content/Widget/VCard.php:126 src/Model/Contact.php:1209 #: src/Content/Widget/VCard.php:125 src/Model/Contact.php:1209
#: src/Model/Profile.php:443 #: src/Model/Profile.php:443
msgid "View group" msgid "View group"
msgstr "" msgstr ""
@ -5630,7 +5630,7 @@ msgstr ""
msgid "Babel" msgid "Babel"
msgstr "" msgstr ""
#: src/Module/BaseAdmin.php:97 src/Module/Debug/ActivityPubConversion.php:129 #: src/Module/BaseAdmin.php:97 src/Module/Debug/ActivityPubConversion.php:125
msgid "ActivityPub Conversion" msgid "ActivityPub Conversion"
msgstr "" msgstr ""
@ -6248,7 +6248,7 @@ msgstr[1] ""
#: src/Module/Contact/Follow.php:56 src/Module/Contact/Redir.php:45 #: src/Module/Contact/Follow.php:56 src/Module/Contact/Redir.php:45
#: src/Module/Contact/Redir.php:206 src/Module/Conversation/Community.php:154 #: src/Module/Contact/Redir.php:206 src/Module/Conversation/Community.php:154
#: src/Module/Debug/ItemBody.php:24 src/Module/Diaspora/Receive.php:45 #: src/Module/Debug/ItemBody.php:30 src/Module/Diaspora/Receive.php:45
#: src/Module/Item/Display.php:82 src/Module/Item/Feed.php:45 #: src/Module/Item/Display.php:82 src/Module/Item/Feed.php:45
#: src/Module/Item/Follow.php:27 src/Module/Item/Ignore.php:27 #: src/Module/Item/Follow.php:27 src/Module/Item/Ignore.php:27
#: src/Module/Item/Language.php:39 src/Module/Item/Pin.php:27 #: src/Module/Item/Language.php:39 src/Module/Item/Pin.php:27
@ -6732,23 +6732,23 @@ msgstr ""
msgid "Activity" msgid "Activity"
msgstr "" msgstr ""
#: src/Module/Debug/ActivityPubConversion.php:109 #: src/Module/Debug/ActivityPubConversion.php:105
msgid "Object data" msgid "Object data"
msgstr "" msgstr ""
#: src/Module/Debug/ActivityPubConversion.php:116 #: src/Module/Debug/ActivityPubConversion.php:112
msgid "Result Item" msgid "Result Item"
msgstr "" msgstr ""
#: src/Module/Debug/ActivityPubConversion.php:121 #: src/Module/Debug/ActivityPubConversion.php:117
#: src/Module/Debug/Babel.php:286 src/Module/Moderation/Item/Source.php:79 #: src/Module/Debug/Babel.php:267 src/Module/Moderation/Item/Source.php:79
#: src/Module/Security/TwoFactor/Verify.php:84 #: src/Module/Security/TwoFactor/Verify.php:84
msgid "Error" msgid "Error"
msgid_plural "Errors" msgid_plural "Errors"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Module/Debug/ActivityPubConversion.php:130 #: src/Module/Debug/ActivityPubConversion.php:126
msgid "Source activity" msgid "Source activity"
msgstr "" msgstr ""
@ -6884,47 +6884,39 @@ msgstr ""
msgid "HTML::toPlaintext (compact)" msgid "HTML::toPlaintext (compact)"
msgstr "" msgstr ""
#: src/Module/Debug/Babel.php:248 #: src/Module/Debug/Babel.php:243
msgid "Decoded post" msgid "Decoded post"
msgstr "" msgstr ""
#: src/Module/Debug/Babel.php:269 #: src/Module/Debug/Babel.php:262
msgid "Post array before expand entities" msgid "Post array before expand entities"
msgstr "" msgstr ""
#: src/Module/Debug/Babel.php:276 #: src/Module/Debug/Babel.php:268
msgid "Post converted"
msgstr ""
#: src/Module/Debug/Babel.php:281
msgid "Converted body"
msgstr ""
#: src/Module/Debug/Babel.php:287
msgid "Twitter addon is absent from the addon/ folder." msgid "Twitter addon is absent from the addon/ folder."
msgstr "" msgstr ""
#: src/Module/Debug/Babel.php:297 #: src/Module/Debug/Babel.php:278
msgid "Babel Diagnostic" msgid "Babel Diagnostic"
msgstr "" msgstr ""
#: src/Module/Debug/Babel.php:299 #: src/Module/Debug/Babel.php:280
msgid "Source text" msgid "Source text"
msgstr "" msgstr ""
#: src/Module/Debug/Babel.php:300 #: src/Module/Debug/Babel.php:281
msgid "BBCode" msgid "BBCode"
msgstr "" msgstr ""
#: src/Module/Debug/Babel.php:302 #: src/Module/Debug/Babel.php:283
msgid "Markdown" msgid "Markdown"
msgstr "" msgstr ""
#: src/Module/Debug/Babel.php:303 #: src/Module/Debug/Babel.php:284
msgid "HTML" msgid "HTML"
msgstr "" msgstr ""
#: src/Module/Debug/Babel.php:305 #: src/Module/Debug/Babel.php:286
msgid "Twitter Source / Tweet URL (requires API key)" msgid "Twitter Source / Tweet URL (requires API key)"
msgstr "" msgstr ""