Merge pull request #14529 from Art4/add-static-code-analysis

Add static code analysis with PHPStan level 0
This commit is contained in:
Hypolite Petovan 2024-11-15 13:52:45 -05:00 committed by GitHub
commit b8aa6f15c9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
25 changed files with 472 additions and 337 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",
"mockery/mockery": "^1.3",
"php-mock/php-mock-phpunit": "^2.10",
"phpstan/phpstan": "^2.0",
"phpunit/phpunit": "^9"
},
"scripts": {
"test": "phpunit",
"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",
"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:check": [
"@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",
"This file is @generated automatically"
],
"content-hash": "d51158b9593011921144e90af146a86a",
"content-hash": "3e31a2243fb69e47e1b7000cca946fa2",
"packages": [
{
"name": "asika/simple-console",
@ -4832,6 +4832,64 @@
],
"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",
"version": "9.2.31",

View file

@ -210,7 +210,7 @@ class Mode
public function isInstall(): bool
{
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
{
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
{
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
{
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 new static($array);
$class = get_class($this);
return new $class($array);
}, array_chunk($this->getArrayCopy(), $length));
}

View file

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

View file

@ -8,6 +8,7 @@
namespace Friendica\Console;
use Asika\SimpleConsole\Console;
use Exception;
use Friendica\App;
use Friendica\App\BaseURL;
use Friendica\Core\Config\Capability\IManageConfigValues;
@ -54,12 +55,12 @@ Options
-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)
-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|--basepath <base_path> The basepath of Friendica (env FRIENDICA_BASE_PATH)
-t|--tz <timezone> The timezone of Friendica (env FRIENDICA_TZ)
-L|--lang <language> The language of Friendica (env FRIENDICA_LANG)
Environment variables
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
@ -73,7 +74,7 @@ Environment variables
FRIENDICA_ADMIN_MAIL The admin email address of Friendica (this email will be used for admin access)
FRIENDICA_TZ The timezone of Friendica
FRIENDICA_LANG The langauge of Friendica
Examples
bin/console autoinstall -f 'input.config.php
Installs Friendica with the prepared 'input.config.php' file

View file

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

View file

@ -7,12 +7,11 @@
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\DBA;
use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Util\Strings;
use RuntimeException;
/**
@ -23,13 +22,17 @@ class FixAPDeliveryWorkerTaskParameters extends \Asika\SimpleConsole\Console
protected $helpOptions = ['h', 'help', '?'];
/**
* @var App\Mode
* @var Mode
*/
private $appMode;
/**
* @var Database
*/
private $dba;
/**
* @var L10n
*/
private $l10n;
/**
* @var int
*/
@ -53,7 +56,7 @@ Usage
Description
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.
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
-h|--help|-? Show help information
@ -62,7 +65,7 @@ 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);
@ -80,7 +83,7 @@ HELP;
}
if (count($this->args) > 0) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
throw new CommandArgsException('Too many arguments');
}
if ($this->appMode->isInstall()) {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -3198,10 +3198,10 @@ class Item
} elseif ($remote_user) {
// Authenticated visitor - fetch the matching permissionsets
$permissionSets = DI::permissionSet()->selectByContactId($remote_user, $owner_id);
if (!empty($set)) {
if (!empty($permissionSets)) {
$condition = [
"(`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
];
$condition = array_merge($condition, $permissionSets->column('id'));
@ -3247,7 +3247,7 @@ class Item
*/
$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')) . "))";
} else {
$sql_set = '';

View file

@ -157,10 +157,6 @@ class Search extends BaseApi
$condition = DBA::mergeConditions($condition, ["`uri-id` < ?", $max_id]);
}
if (!empty($since_id)) {
$condition = DBA::mergeConditions($condition, ["`uri-id` > ?", $since_id]);
}
if (!empty($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
{
function visible_whitespace($s)
{
return '<pre>' . htmlspecialchars($s) . '</pre>';
}
$results = [];
$visible_whitespace = function (string $s): string {
return '<pre>' . htmlspecialchars($s) . '</pre>';
};
if (!empty($_REQUEST['source'])) {
try {
$source = json_decode($_REQUEST['source'], true);
@ -43,11 +43,11 @@ class ActivityPubConversion extends BaseModule
$formatted = json_encode($source, JSON_PRETTY_PRINT);
$results[] = [
'title' => DI::l10n()->t('Formatted'),
'content' => visible_whitespace(trim(var_export($formatted, true), "'")),
'content' => $visible_whitespace(trim(var_export($formatted, true), "'")),
];
$results[] = [
'title' => DI::l10n()->t('Source'),
'content' => visible_whitespace(var_export($source, true))
'content' => $visible_whitespace(var_export($source, true))
];
$activity = JsonLD::compact($source);
if (!$activity) {
@ -55,7 +55,7 @@ class ActivityPubConversion extends BaseModule
}
$results[] = [
'title' => DI::l10n()->t('Activity'),
'content' => visible_whitespace(var_export($activity, true))
'content' => $visible_whitespace(var_export($activity, true))
];
$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.');
}
if (!empty($body) && empty($object_data['raw'])) {
$object_data['raw'] = $body;
}
// Internal flag for thread completion. See Processor.php
if (!empty($activity['thread-completion'])) {
$object_data['thread-completion'] = $activity['thread-completion'];
@ -107,14 +103,14 @@ class ActivityPubConversion extends BaseModule
$results[] = [
'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);
$results[] = [
'title' => DI::l10n()->t('Result Item'),
'content' => visible_whitespace(var_export($item, true))
'content' => $visible_whitespace(var_export($item, true))
];
} catch (\Throwable $e) {
$results[] = [

View file

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

View file

@ -11,36 +11,43 @@ use Friendica\BaseModule;
use Friendica\Core\System;
use Friendica\DI;
use Friendica\Model\Post;
use Friendica\Network\HTTPException;
use Friendica\Network\HTTPException\NotFoundException;
use Friendica\Network\HTTPException\UnauthorizedException;
/**
* Print the body of an Item
*/
class ItemBody extends BaseModule
{
/**
* @throws NotFoundException|UnauthorizedException
*
* @return string|never
*/
protected function content(array $request = []): string
{
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'])) {
throw new HTTPException\NotFoundException(DI::l10n()->t('Item not found.'));
throw new NotFoundException(DI::l10n()->t('Item not found.'));
}
$itemId = intval($this->parameters['item']);
$item = Post::selectFirst(['body'], ['uid' => [0, DI::userSession()->getLocalUserId()], 'uri-id' => $itemId]);
if (!empty($item)) {
if (DI::mode()->isAjax()) {
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.'));
if (empty($item)) {
throw new 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
{
// /** @var string (Enumerable, oneOf) */
// protected $posting_default_visibility;
// /** @var bool */
// protected $posting_default_sensitive;
// /** @var string (ISO 639-1 language two-letter code), or null*/
// protected $posting_default_language;
// /** @var string (Enumerable, oneOf) */
// protected $reading_expand_media;
// /** @var bool */
// protected $reading_expand_spoilers;
/**
* @var string (Enumerable, oneOf)
*/
private $visibility;
/**
* @var bool
*/
private $sensitive;
/**
* @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.
@ -39,10 +53,26 @@ class Preferences extends BaseDataTransferObject
*/
public function __construct(string $visibility, bool $sensitive, string $language, string $media, bool $spoilers)
{
$this->{'posting:default:visibility'} = $visibility;
$this->{'posting:default:sensitive'} = $sensitive;
$this->{'posting:default:language'} = $language;
$this->{'reading:expand:media'} = $media;
$this->{'reading:expand:spoilers'} = $spoilers;
$this->visibility = $visibility;
$this->sensitive = $sensitive;
$this->language = $language;
$this->media = $media;
$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);
$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'] = $receivers;
$object_data['reception_type'] = $reception_types;
$object_data['receiver'] = [];
$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'])) {
$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;
}

View file

@ -359,6 +359,8 @@ class Temporal
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 ""
"Project-Id-Version: 2024.09-dev\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-10-07 20:46+0000\n"
"POT-Creation-Date: 2024-11-10 07:44+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -39,8 +39,8 @@ msgid "Empty post discarded."
msgstr ""
#: 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/Debug/ItemBody.php:43 src/Module/Item/Feed.php:66
#: src/Module/Admin/Themes/Index.php:51 src/Module/Debug/ItemBody.php:34
#: src/Module/Debug/ItemBody.php:42 src/Module/Item/Feed.php:66
msgid "Item not found."
msgstr ""
@ -291,9 +291,9 @@ msgstr ""
#: mod/photos.php:778 mod/photos.php:1055 mod/photos.php:1096
#: mod/photos.php:1152 mod/photos.php:1232
#: src/Module/Calendar/Event/Form.php:236 src/Module/Contact/Advanced.php:118
#: src/Module/Contact/Profile.php:370
#: src/Module/Debug/ActivityPubConversion.php:132
#: src/Module/Debug/Babel.php:307 src/Module/Debug/Localtime.php:50
#: src/Module/Contact/Profile.php:371
#: src/Module/Debug/ActivityPubConversion.php:124
#: src/Module/Debug/Babel.php:283 src/Module/Debug/Localtime.php:50
#: src/Module/Debug/Probe.php:40 src/Module/Debug/WebFinger.php:37
#: src/Module/FriendSuggest.php:131 src/Module/Install.php:220
#: src/Module/Install.php:260 src/Module/Install.php:295
@ -792,15 +792,15 @@ msgstr ""
msgid "Common"
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"
msgstr ""
#: src/Console/Addon.php:165
#: src/Console/Addon.php:167
msgid "Addon already enabled"
msgstr ""
#: src/Console/Addon.php:189
#: src/Console/Addon.php:191
msgid "Addon already disabled"
msgstr ""
@ -1065,7 +1065,7 @@ msgstr ""
msgid "Email"
msgstr ""
#: src/Content/ContactSelector.php:116 src/Module/Debug/Babel.php:301
#: src/Content/ContactSelector.php:116 src/Module/Debug/Babel.php:277
msgid "Diaspora"
msgstr ""
@ -1365,7 +1365,7 @@ msgstr ""
msgid "Public post"
msgstr ""
#: src/Content/Conversation.php:410 src/Content/Widget/VCard.php:117
#: src/Content/Conversation.php:410 src/Content/Widget/VCard.php:116
#: src/Model/Profile.php:462 src/Module/Admin/Logs/View.php:80
#: src/Module/Post/Edit.php:167
msgid "Message"
@ -1881,7 +1881,7 @@ msgid "Send PM"
msgstr ""
#: src/Content/Item.php:421 src/Module/Contact.php:449
#: src/Module/Contact/Profile.php:518
#: src/Module/Contact/Profile.php:519
#: src/Module/Moderation/Blocklist/Contact.php:102
#: src/Module/Moderation/Users/Active.php:123
#: src/Module/Moderation/Users/Index.php:138
@ -1889,7 +1889,7 @@ msgid "Block"
msgstr ""
#: src/Content/Item.php:422 src/Module/Contact.php:450
#: src/Module/Contact/Profile.php:526
#: src/Module/Contact/Profile.php:527
#: src/Module/Notifications/Introductions.php:126
#: src/Module/Notifications/Introductions.php:198
#: src/Module/Notifications/Notification.php:75
@ -1897,7 +1897,7 @@ msgid "Ignore"
msgstr ""
#: src/Content/Item.php:423 src/Module/Contact.php:451
#: src/Module/Contact/Profile.php:534
#: src/Module/Contact/Profile.php:535
msgid "Collapse"
msgstr ""
@ -1969,7 +1969,7 @@ msgstr ""
#: src/Content/Nav.php:216 src/Module/BaseProfile.php:35
#: src/Module/BaseSettings.php:84 src/Module/Contact.php:485
#: src/Module/Contact/Profile.php:425 src/Module/Profile/Profile.php:256
#: src/Module/Contact/Profile.php:426 src/Module/Profile/Profile.php:256
#: src/Module/Welcome.php:43 view/theme/frio/theme.php:221
msgid "Profile"
msgstr ""
@ -2278,8 +2278,8 @@ msgstr ""
msgid "The end"
msgstr ""
#: src/Content/Text/HTML.php:847 src/Content/Widget/VCard.php:113
#: src/Model/Profile.php:456 src/Module/Contact/Profile.php:478
#: src/Content/Text/HTML.php:847 src/Content/Widget/VCard.php:112
#: src/Model/Profile.php:456 src/Module/Contact/Profile.php:479
msgid "Follow"
msgstr ""
@ -2421,18 +2421,18 @@ msgstr ""
msgid "Export calendar as csv"
msgstr ""
#: src/Content/Widget/ContactBlock.php:65
#: src/Content/Widget/ContactBlock.php:64
msgid "No contacts"
msgstr ""
#: src/Content/Widget/ContactBlock.php:96
#: src/Content/Widget/ContactBlock.php:95
#, php-format
msgid "%d Contact"
msgid_plural "%d Contacts"
msgstr[0] ""
msgstr[1] ""
#: src/Content/Widget/ContactBlock.php:113
#: src/Content/Widget/ContactBlock.php:112
msgid "View Contacts"
msgstr ""
@ -2451,46 +2451,46 @@ msgstr[1] ""
msgid "More Trending Tags"
msgstr ""
#: src/Content/Widget/VCard.php:91 src/Model/Contact.php:1212
#: src/Content/Widget/VCard.php:90 src/Model/Contact.php:1212
#: src/Model/Profile.php:441
msgid "Post to group"
msgstr ""
#: src/Content/Widget/VCard.php:96 src/Model/Contact.php:1216
#: src/Content/Widget/VCard.php:95 src/Model/Contact.php:1216
#: src/Model/Profile.php:445 src/Module/Moderation/Item/Source.php:77
msgid "Mention"
msgstr ""
#: src/Content/Widget/VCard.php:106 src/Model/Profile.php:360
#: src/Module/Contact/Profile.php:414 src/Module/Profile/Profile.php:187
#: src/Content/Widget/VCard.php:105 src/Model/Profile.php:360
#: src/Module/Contact/Profile.php:415 src/Module/Profile/Profile.php:187
msgid "XMPP:"
msgstr ""
#: src/Content/Widget/VCard.php:107 src/Model/Profile.php:361
#: src/Module/Contact/Profile.php:416 src/Module/Profile/Profile.php:191
#: src/Content/Widget/VCard.php:106 src/Model/Profile.php:361
#: src/Module/Contact/Profile.php:417 src/Module/Profile/Profile.php:191
msgid "Matrix:"
msgstr ""
#: src/Content/Widget/VCard.php:108 src/Model/Event.php:68
#: src/Content/Widget/VCard.php:107 src/Model/Event.php:68
#: 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:412
#: src/Model/Profile.php:355 src/Module/Contact/Profile.php:413
#: src/Module/Directory.php:134 src/Module/Notifications/Introductions.php:179
#: src/Module/Profile/Profile.php:209
msgid "Location:"
msgstr ""
#: src/Content/Widget/VCard.php:111 src/Model/Profile.php:469
#: src/Content/Widget/VCard.php:110 src/Model/Profile.php:469
#: src/Module/Notifications/Introductions.php:193
msgid "Network:"
msgstr ""
#: src/Content/Widget/VCard.php:115 src/Model/Contact.php:1244
#: src/Content/Widget/VCard.php:114 src/Model/Contact.php:1244
#: src/Model/Contact.php:1256 src/Model/Profile.php:458
#: src/Module/Contact/Profile.php:470
#: src/Module/Contact/Profile.php:471
msgid "Unfollow"
msgstr ""
#: src/Content/Widget/VCard.php:121 src/Model/Contact.php:1214
#: src/Content/Widget/VCard.php:120 src/Model/Contact.php:1214
#: src/Model/Profile.php:443
msgid "View group"
msgstr ""
@ -3481,7 +3481,7 @@ msgstr ""
msgid "Homepage:"
msgstr ""
#: src/Model/Profile.php:359 src/Module/Contact/Profile.php:418
#: src/Model/Profile.php:359 src/Module/Contact/Profile.php:419
#: src/Module/Notifications/Introductions.php:181
msgid "About:"
msgstr ""
@ -4198,7 +4198,7 @@ msgid "Data"
msgstr ""
#: src/Module/Admin/Logs/View.php:86
#: src/Module/Debug/ActivityPubConversion.php:49
#: src/Module/Debug/ActivityPubConversion.php:45
msgid "Source"
msgstr ""
@ -5175,7 +5175,7 @@ msgstr ""
msgid "Can be \"all\" or \"tags\". \"all\" means that every public post should be received. \"tags\" means that only posts with selected tags should be received."
msgstr ""
#: src/Module/Admin/Site.php:584 src/Module/Contact/Profile.php:314
#: src/Module/Admin/Site.php:584 src/Module/Contact/Profile.php:315
#: src/Module/Settings/TwoFactor/Index.php:132
msgid "Disabled"
msgstr ""
@ -5628,7 +5628,7 @@ msgstr ""
msgid "Babel"
msgstr ""
#: src/Module/BaseAdmin.php:97 src/Module/Debug/ActivityPubConversion.php:129
#: src/Module/BaseAdmin.php:97 src/Module/Debug/ActivityPubConversion.php:121
msgid "ActivityPub Conversion"
msgstr ""
@ -5928,8 +5928,8 @@ msgstr ""
#: src/Module/Contact/Conversations.php:77
#: src/Module/Contact/Conversations.php:82 src/Module/Contact/Media.php:47
#: src/Module/Contact/Posts.php:64 src/Module/Contact/Posts.php:69
#: src/Module/Contact/Posts.php:74 src/Module/Contact/Profile.php:145
#: src/Module/Contact/Profile.php:150 src/Module/Contact/Profile.php:169
#: src/Module/Contact/Posts.php:74 src/Module/Contact/Profile.php:146
#: src/Module/Contact/Profile.php:151 src/Module/Contact/Profile.php:170
#: src/Module/Contact/Redir.php:77 src/Module/Contact/Redir.php:131
#: src/Module/FriendSuggest.php:57 src/Module/FriendSuggest.php:95
msgid "Contact not found."
@ -6086,18 +6086,18 @@ msgstr ""
msgid "Update"
msgstr ""
#: src/Module/Contact.php:449 src/Module/Contact/Profile.php:518
#: src/Module/Contact.php:449 src/Module/Contact/Profile.php:519
#: src/Module/Moderation/Blocklist/Contact.php:103
#: src/Module/Moderation/Users/Blocked.php:124
#: src/Module/Moderation/Users/Index.php:140
msgid "Unblock"
msgstr ""
#: src/Module/Contact.php:450 src/Module/Contact/Profile.php:526
#: src/Module/Contact.php:450 src/Module/Contact/Profile.php:527
msgid "Unignore"
msgstr ""
#: src/Module/Contact.php:451 src/Module/Contact/Profile.php:534
#: src/Module/Contact.php:451 src/Module/Contact/Profile.php:535
msgid "Uncollapse"
msgstr ""
@ -6149,7 +6149,7 @@ msgstr ""
msgid "Pending incoming contact request"
msgstr ""
#: src/Module/Contact.php:608 src/Module/Contact/Profile.php:377
#: src/Module/Contact.php:608 src/Module/Contact/Profile.php:378
#, php-format
msgid "Visit %s's profile [%s]"
msgstr ""
@ -6246,7 +6246,7 @@ msgstr[1] ""
#: 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/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/Follow.php:27 src/Module/Item/Ignore.php:27
#: src/Module/Item/Language.php:39 src/Module/Item/Pin.php:27
@ -6280,7 +6280,7 @@ msgstr ""
msgid "Your Identity Address:"
msgstr ""
#: src/Module/Contact/Follow.php:151 src/Module/Contact/Profile.php:408
#: src/Module/Contact/Follow.php:151 src/Module/Contact/Profile.php:409
#: src/Module/Contact/Unfollow.php:115
#: src/Module/Moderation/Blocklist/Contact.php:117
#: src/Module/Moderation/Reports.php:109
@ -6289,7 +6289,7 @@ msgstr ""
msgid "Profile URL"
msgstr ""
#: src/Module/Contact/Follow.php:152 src/Module/Contact/Profile.php:420
#: src/Module/Contact/Follow.php:152 src/Module/Contact/Profile.php:421
#: src/Module/Notifications/Introductions.php:183
#: src/Module/Profile/Profile.php:222
msgid "Tags:"
@ -6332,297 +6332,297 @@ msgstr ""
msgid "Failed to update contact record."
msgstr ""
#: src/Module/Contact/Profile.php:195
#: src/Module/Contact/Profile.php:196
msgid "Contact has been unblocked"
msgstr ""
#: src/Module/Contact/Profile.php:199
#: src/Module/Contact/Profile.php:200
msgid "Contact has been blocked"
msgstr ""
#: src/Module/Contact/Profile.php:211
#: src/Module/Contact/Profile.php:212
msgid "Contact has been unignored"
msgstr ""
#: src/Module/Contact/Profile.php:215
#: src/Module/Contact/Profile.php:216
msgid "Contact has been ignored"
msgstr ""
#: src/Module/Contact/Profile.php:227
#: src/Module/Contact/Profile.php:228
msgid "Contact has been uncollapsed"
msgstr ""
#: src/Module/Contact/Profile.php:231
#: src/Module/Contact/Profile.php:232
msgid "Contact has been collapsed"
msgstr ""
#: src/Module/Contact/Profile.php:259
#, php-format
msgid "You are mutual friends with %s"
msgstr ""
#: src/Module/Contact/Profile.php:260
#, php-format
msgid "You are sharing with %s"
msgid "You are mutual friends with %s"
msgstr ""
#: src/Module/Contact/Profile.php:261
#, php-format
msgid "You are sharing with %s"
msgstr ""
#: src/Module/Contact/Profile.php:262
#, php-format
msgid "%s is sharing with you"
msgstr ""
#: src/Module/Contact/Profile.php:277
#: src/Module/Contact/Profile.php:278
msgid "Private communications are not available for this contact."
msgstr ""
#: src/Module/Contact/Profile.php:287
#: src/Module/Contact/Profile.php:288
msgid "This contact is on a server you ignored."
msgstr ""
#: src/Module/Contact/Profile.php:290
#: src/Module/Contact/Profile.php:291
msgid "Never"
msgstr ""
#: src/Module/Contact/Profile.php:293
#: src/Module/Contact/Profile.php:294
msgid "(Update was not successful)"
msgstr ""
#: src/Module/Contact/Profile.php:293
#: src/Module/Contact/Profile.php:294
msgid "(Update was successful)"
msgstr ""
#: src/Module/Contact/Profile.php:295 src/Module/Contact/Profile.php:489
#: src/Module/Contact/Profile.php:296 src/Module/Contact/Profile.php:490
msgid "Suggest friends"
msgstr ""
#: src/Module/Contact/Profile.php:299
#: src/Module/Contact/Profile.php:300
#, php-format
msgid "Network type: %s"
msgstr ""
#: src/Module/Contact/Profile.php:304
#: src/Module/Contact/Profile.php:305
msgid "Communications lost with this contact!"
msgstr ""
#: src/Module/Contact/Profile.php:310
#: src/Module/Contact/Profile.php:311
msgid "Fetch further information for feeds"
msgstr ""
#: src/Module/Contact/Profile.php:312
#: src/Module/Contact/Profile.php:313
msgid "Fetch information like preview pictures, title and teaser from the feed item. You can activate this if the feed doesn't contain much text. Keywords are taken from the meta header in the feed item and are posted as hash tags."
msgstr ""
#: src/Module/Contact/Profile.php:315
#: src/Module/Contact/Profile.php:316
msgid "Fetch information"
msgstr ""
#: src/Module/Contact/Profile.php:316
#: src/Module/Contact/Profile.php:317
msgid "Fetch keywords"
msgstr ""
#: src/Module/Contact/Profile.php:317
#: src/Module/Contact/Profile.php:318
msgid "Fetch information and keywords"
msgstr ""
#: src/Module/Contact/Profile.php:327 src/Module/Contact/Profile.php:332
#: src/Module/Contact/Profile.php:337 src/Module/Contact/Profile.php:343
#: src/Module/Contact/Profile.php:328 src/Module/Contact/Profile.php:333
#: src/Module/Contact/Profile.php:338 src/Module/Contact/Profile.php:344
msgid "No mirroring"
msgstr ""
#: src/Module/Contact/Profile.php:328 src/Module/Contact/Profile.php:338
#: src/Module/Contact/Profile.php:344
#: src/Module/Contact/Profile.php:329 src/Module/Contact/Profile.php:339
#: src/Module/Contact/Profile.php:345
msgid "Mirror as my own posting"
msgstr ""
#: src/Module/Contact/Profile.php:333 src/Module/Contact/Profile.php:339
#: src/Module/Contact/Profile.php:334 src/Module/Contact/Profile.php:340
msgid "Native reshare"
msgstr ""
#: src/Module/Contact/Profile.php:359
#: src/Module/Contact/Profile.php:360
msgid "Contact Information / Notes"
msgstr ""
#: src/Module/Contact/Profile.php:360
#: src/Module/Contact/Profile.php:361
msgid "Contact Settings"
msgstr ""
#: src/Module/Contact/Profile.php:368
#: src/Module/Contact/Profile.php:369
msgid "Contact"
msgstr ""
#: src/Module/Contact/Profile.php:372
#: src/Module/Contact/Profile.php:373
msgid "Their personal note"
msgstr ""
#: src/Module/Contact/Profile.php:374
#: src/Module/Contact/Profile.php:375
msgid "Edit contact notes"
msgstr ""
#: src/Module/Contact/Profile.php:378
#: src/Module/Contact/Profile.php:379
msgid "Block/Unblock contact"
msgstr ""
#: src/Module/Contact/Profile.php:379
#: src/Module/Contact/Profile.php:380
#: src/Module/Moderation/Report/Create.php:279
msgid "Ignore contact"
msgstr ""
#: src/Module/Contact/Profile.php:380
#: src/Module/Contact/Profile.php:381
msgid "View conversations"
msgstr ""
#: src/Module/Contact/Profile.php:385
#: src/Module/Contact/Profile.php:386
msgid "Last update:"
msgstr ""
#: src/Module/Contact/Profile.php:387
#: src/Module/Contact/Profile.php:388
msgid "Update public posts"
msgstr ""
#: src/Module/Contact/Profile.php:389 src/Module/Contact/Profile.php:499
#: src/Module/Contact/Profile.php:390 src/Module/Contact/Profile.php:500
msgid "Update now"
msgstr ""
#: src/Module/Contact/Profile.php:391
#: src/Module/Contact/Profile.php:392
msgid "Awaiting connection acknowledge"
msgstr ""
#: src/Module/Contact/Profile.php:392
#: src/Module/Contact/Profile.php:393
msgid "Currently blocked"
msgstr ""
#: src/Module/Contact/Profile.php:393
#: src/Module/Contact/Profile.php:394
msgid "Currently ignored"
msgstr ""
#: src/Module/Contact/Profile.php:394
#: src/Module/Contact/Profile.php:395
msgid "Currently collapsed"
msgstr ""
#: src/Module/Contact/Profile.php:395
#: src/Module/Contact/Profile.php:396
msgid "Currently archived"
msgstr ""
#: src/Module/Contact/Profile.php:398
#: src/Module/Contact/Profile.php:399
msgid "Manage remote servers"
msgstr ""
#: src/Module/Contact/Profile.php:400
#: src/Module/Contact/Profile.php:401
#: src/Module/Notifications/Introductions.php:184
msgid "Hide this contact from others"
msgstr ""
#: src/Module/Contact/Profile.php:400
#: src/Module/Contact/Profile.php:401
msgid "Replies/likes to your public posts <strong>may</strong> still be visible"
msgstr ""
#: src/Module/Contact/Profile.php:401
#: src/Module/Contact/Profile.php:402
msgid "Notification for new posts"
msgstr ""
#: src/Module/Contact/Profile.php:401
#: src/Module/Contact/Profile.php:402
msgid "Send a notification of every new post of this contact"
msgstr ""
#: src/Module/Contact/Profile.php:403
#: src/Module/Contact/Profile.php:404
msgid "Keyword Deny List"
msgstr ""
#: src/Module/Contact/Profile.php:403
#: src/Module/Contact/Profile.php:404
msgid "Comma separated list of keywords that should not be converted to hashtags, when \"Fetch information and keywords\" is selected"
msgstr ""
#: src/Module/Contact/Profile.php:421
#: src/Module/Contact/Profile.php:422
#: src/Module/Settings/TwoFactor/Index.php:146
msgid "Actions"
msgstr ""
#: src/Module/Contact/Profile.php:423
#: src/Module/Contact/Profile.php:424
#: src/Module/Settings/TwoFactor/Index.php:126 view/theme/frio/theme.php:220
msgid "Status"
msgstr ""
#: src/Module/Contact/Profile.php:429
#: src/Module/Contact/Profile.php:430
msgid "Mirror postings from this contact"
msgstr ""
#: src/Module/Contact/Profile.php:431
#: src/Module/Contact/Profile.php:432
msgid "Mark this contact as remote_self, this will cause friendica to repost new entries from this contact."
msgstr ""
#: src/Module/Contact/Profile.php:434
#: src/Module/Contact/Profile.php:435
msgid "Channel Settings"
msgstr ""
#: src/Module/Contact/Profile.php:435
#: src/Module/Contact/Profile.php:436
msgid "Frequency of this contact in relevant channels"
msgstr ""
#: src/Module/Contact/Profile.php:436
#: src/Module/Contact/Profile.php:437
msgid "Depending on the type of the channel not all posts from this contact are displayed. By default, posts need to have a minimum amount of interactions (comments, likes) to show in your channels. On the other hand there can be contacts who flood the channel, so you might want to see only some of their posts. Or you don't want to see their content at all, but you don't want to block or hide the contact completely."
msgstr ""
#: src/Module/Contact/Profile.php:437
#: src/Module/Contact/Profile.php:438
msgid "Default frequency"
msgstr ""
#: src/Module/Contact/Profile.php:437
#: src/Module/Contact/Profile.php:438
msgid "Posts by this contact are displayed in the \"for you\" channel if you interact often with this contact or if a post reached some level of interaction."
msgstr ""
#: src/Module/Contact/Profile.php:438
#: src/Module/Contact/Profile.php:439
msgid "Display all posts of this contact"
msgstr ""
#: src/Module/Contact/Profile.php:438
#: src/Module/Contact/Profile.php:439
msgid "All posts from this contact will appear on the \"for you\" channel"
msgstr ""
#: src/Module/Contact/Profile.php:439
#: src/Module/Contact/Profile.php:440
msgid "Display only few posts"
msgstr ""
#: src/Module/Contact/Profile.php:439
#: src/Module/Contact/Profile.php:440
msgid "When a contact creates a lot of posts in a short period, this setting reduces the number of displayed posts in every channel."
msgstr ""
#: src/Module/Contact/Profile.php:440
#: src/Module/Contact/Profile.php:441
msgid "Never display posts"
msgstr ""
#: src/Module/Contact/Profile.php:440
#: src/Module/Contact/Profile.php:441
msgid "Posts from this contact will never be displayed in any channel"
msgstr ""
#: src/Module/Contact/Profile.php:441
#: src/Module/Contact/Profile.php:442
msgid "Channel Only"
msgstr ""
#: src/Module/Contact/Profile.php:441
#: src/Module/Contact/Profile.php:442
msgid "If enabled, posts from this contact will only appear in channels and network streams in circles, but not in the general network stream."
msgstr ""
#: src/Module/Contact/Profile.php:509
#: src/Module/Contact/Profile.php:510
msgid "Refetch contact data"
msgstr ""
#: src/Module/Contact/Profile.php:520
#: src/Module/Contact/Profile.php:521
msgid "Toggle Blocked status"
msgstr ""
#: src/Module/Contact/Profile.php:528
#: src/Module/Contact/Profile.php:529
msgid "Toggle Ignored status"
msgstr ""
#: src/Module/Contact/Profile.php:536
#: src/Module/Contact/Profile.php:537
msgid "Toggle Collapsed status"
msgstr ""
#: src/Module/Contact/Profile.php:543 src/Module/Contact/Revoke.php:89
#: src/Module/Contact/Profile.php:544 src/Module/Contact/Revoke.php:89
msgid "Revoke Follow"
msgstr ""
#: src/Module/Contact/Profile.php:545
#: src/Module/Contact/Profile.php:546
msgid "Revoke the follow from this contact"
msgstr ""
@ -6722,207 +6722,199 @@ msgstr ""
msgid "Friendica is a community project, that would not be possible without the help of many people. Here is a list of those who have contributed to the code or the translation of Friendica. Thank you all!"
msgstr ""
#: src/Module/Debug/ActivityPubConversion.php:45
#: src/Module/Debug/ActivityPubConversion.php:41
msgid "Formatted"
msgstr ""
#: src/Module/Debug/ActivityPubConversion.php:57
#: src/Module/Debug/ActivityPubConversion.php:53
msgid "Activity"
msgstr ""
#: src/Module/Debug/ActivityPubConversion.php:109
#: src/Module/Debug/ActivityPubConversion.php:101
msgid "Object data"
msgstr ""
#: src/Module/Debug/ActivityPubConversion.php:116
#: src/Module/Debug/ActivityPubConversion.php:108
msgid "Result Item"
msgstr ""
#: src/Module/Debug/ActivityPubConversion.php:121
#: src/Module/Debug/Babel.php:286 src/Module/Moderation/Item/Source.php:79
#: src/Module/Debug/ActivityPubConversion.php:113
#: src/Module/Debug/Babel.php:262 src/Module/Moderation/Item/Source.php:79
#: src/Module/Security/TwoFactor/Verify.php:84
msgid "Error"
msgid_plural "Errors"
msgstr[0] ""
msgstr[1] ""
#: src/Module/Debug/ActivityPubConversion.php:130
#: src/Module/Debug/ActivityPubConversion.php:122
msgid "Source activity"
msgstr ""
#: src/Module/Debug/Babel.php:44
#: src/Module/Debug/Babel.php:39
msgid "Source input"
msgstr ""
#: src/Module/Debug/Babel.php:50
#: src/Module/Debug/Babel.php:45
msgid "BBCode::toPlaintext"
msgstr ""
#: src/Module/Debug/Babel.php:56
#: src/Module/Debug/Babel.php:51
msgid "BBCode::convert (raw HTML)"
msgstr ""
#: src/Module/Debug/Babel.php:61
#: src/Module/Debug/Babel.php:56
msgid "BBCode::convert (hex)"
msgstr ""
#: src/Module/Debug/Babel.php:66
#: src/Module/Debug/Babel.php:61
msgid "BBCode::convert"
msgstr ""
#: src/Module/Debug/Babel.php:72
#: src/Module/Debug/Babel.php:67
msgid "BBCode::convert => HTML::toBBCode"
msgstr ""
#: src/Module/Debug/Babel.php:78
#: src/Module/Debug/Babel.php:73
msgid "BBCode::toMarkdown"
msgstr ""
#: src/Module/Debug/Babel.php:84
#: src/Module/Debug/Babel.php:79
msgid "BBCode::toMarkdown => Markdown::convert (raw HTML)"
msgstr ""
#: src/Module/Debug/Babel.php:88
#: src/Module/Debug/Babel.php:83
msgid "BBCode::toMarkdown => Markdown::convert"
msgstr ""
#: src/Module/Debug/Babel.php:94
#: src/Module/Debug/Babel.php:89
msgid "BBCode::toMarkdown => Markdown::toBBCode"
msgstr ""
#: src/Module/Debug/Babel.php:100
#: src/Module/Debug/Babel.php:95
msgid "BBCode::toMarkdown => Markdown::convert => HTML::toBBCode"
msgstr ""
#: src/Module/Debug/Babel.php:108
#: src/Module/Debug/Babel.php:103
msgid "Item Body"
msgstr ""
#: src/Module/Debug/Babel.php:112
#: src/Module/Debug/Babel.php:107
msgid "Item Tags"
msgstr ""
#: src/Module/Debug/Babel.php:118
#: src/Module/Debug/Babel.php:113
msgid "PageInfo::appendToBody"
msgstr ""
#: src/Module/Debug/Babel.php:123
#: src/Module/Debug/Babel.php:118
msgid "PageInfo::appendToBody => BBCode::convert (raw HTML)"
msgstr ""
#: src/Module/Debug/Babel.php:127
#: src/Module/Debug/Babel.php:122
msgid "PageInfo::appendToBody => BBCode::convert"
msgstr ""
#: src/Module/Debug/Babel.php:134
#: src/Module/Debug/Babel.php:129
msgid "Source input (Diaspora format)"
msgstr ""
#: src/Module/Debug/Babel.php:143
#: src/Module/Debug/Babel.php:138
msgid "Source input (Markdown)"
msgstr ""
#: src/Module/Debug/Babel.php:149
#: src/Module/Debug/Babel.php:144
msgid "Markdown::convert (raw HTML)"
msgstr ""
#: src/Module/Debug/Babel.php:154
#: src/Module/Debug/Babel.php:149
msgid "Markdown::convert"
msgstr ""
#: src/Module/Debug/Babel.php:160
#: src/Module/Debug/Babel.php:155
msgid "Markdown::toBBCode"
msgstr ""
#: src/Module/Debug/Babel.php:167
#: src/Module/Debug/Babel.php:162
msgid "Raw HTML input"
msgstr ""
#: src/Module/Debug/Babel.php:172
#: src/Module/Debug/Babel.php:167
msgid "HTML Input"
msgstr ""
#: src/Module/Debug/Babel.php:179
#: src/Module/Debug/Babel.php:174
msgid "HTML Purified (raw)"
msgstr ""
#: src/Module/Debug/Babel.php:184
#: src/Module/Debug/Babel.php:179
msgid "HTML Purified (hex)"
msgstr ""
#: src/Module/Debug/Babel.php:189
#: src/Module/Debug/Babel.php:184
msgid "HTML Purified"
msgstr ""
#: src/Module/Debug/Babel.php:195
#: src/Module/Debug/Babel.php:190
msgid "HTML::toBBCode"
msgstr ""
#: src/Module/Debug/Babel.php:201
#: src/Module/Debug/Babel.php:196
msgid "HTML::toBBCode => BBCode::convert"
msgstr ""
#: src/Module/Debug/Babel.php:206
#: src/Module/Debug/Babel.php:201
msgid "HTML::toBBCode => BBCode::convert (raw HTML)"
msgstr ""
#: src/Module/Debug/Babel.php:212
#: src/Module/Debug/Babel.php:207
msgid "HTML::toBBCode => BBCode::toPlaintext"
msgstr ""
#: src/Module/Debug/Babel.php:218
#: src/Module/Debug/Babel.php:213
msgid "HTML::toMarkdown"
msgstr ""
#: src/Module/Debug/Babel.php:224
#: src/Module/Debug/Babel.php:219
msgid "HTML::toPlaintext"
msgstr ""
#: src/Module/Debug/Babel.php:230
#: src/Module/Debug/Babel.php:225
msgid "HTML::toPlaintext (compact)"
msgstr ""
#: src/Module/Debug/Babel.php:248
#: src/Module/Debug/Babel.php:238
msgid "Decoded post"
msgstr ""
#: src/Module/Debug/Babel.php:269
#: src/Module/Debug/Babel.php:257
msgid "Post array before expand entities"
msgstr ""
#: src/Module/Debug/Babel.php:276
msgid "Post converted"
msgstr ""
#: src/Module/Debug/Babel.php:281
msgid "Converted body"
msgstr ""
#: src/Module/Debug/Babel.php:287
#: src/Module/Debug/Babel.php:263
msgid "Twitter addon is absent from the addon/ folder."
msgstr ""
#: src/Module/Debug/Babel.php:297
#: src/Module/Debug/Babel.php:273
msgid "Babel Diagnostic"
msgstr ""
#: src/Module/Debug/Babel.php:299
#: src/Module/Debug/Babel.php:275
msgid "Source text"
msgstr ""
#: src/Module/Debug/Babel.php:300
#: src/Module/Debug/Babel.php:276
msgid "BBCode"
msgstr ""
#: src/Module/Debug/Babel.php:302
#: src/Module/Debug/Babel.php:278
msgid "Markdown"
msgstr ""
#: src/Module/Debug/Babel.php:303
#: src/Module/Debug/Babel.php:279
msgid "HTML"
msgstr ""
#: src/Module/Debug/Babel.php:305
#: src/Module/Debug/Babel.php:281
msgid "Twitter Source / Tweet URL (requires API key)"
msgstr ""