style: update ecs config to align associative arrays arrows

update composer dependencies to latest
This commit is contained in:
Yassine Doghri 2023-06-12 14:47:38 +00:00
parent 3fc1d8e18d
commit 2a50f6e4d2
268 changed files with 3833 additions and 3973 deletions

View File

@ -12,42 +12,24 @@ class DocTypes
* @var array<string, string> * @var array<string, string>
*/ */
public array $list = [ public array $list = [
'xhtml11' => 'xhtml11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">', 'xhtml1-strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
'xhtml1-strict' => 'xhtml1-trans' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">', 'xhtml1-frame' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
'xhtml1-trans' => 'xhtml-basic11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">',
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
'xhtml1-frame' =>
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
'xhtml-basic11' =>
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">',
'html5' => '<!DOCTYPE html>', 'html5' => '<!DOCTYPE html>',
'html4-strict' => 'html4-strict' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">', 'html4-trans' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
'html4-trans' => 'html4-frame' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">',
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">', 'mathml1' => '<!DOCTYPE math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd">',
'html4-frame' => 'mathml2' => '<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd">',
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">', 'svg10' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">',
'mathml1' => 'svg11' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">',
'<!DOCTYPE math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd">', 'svg11-basic' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd">',
'mathml2' => 'svg11-tiny' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">',
'<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd">', 'xhtml-math-svg-xh' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
'svg10' => 'xhtml-math-svg-sh' => '<!DOCTYPE svg:svg PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">', 'xhtml-rdfa-1' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">',
'svg11' => 'xhtml-rdfa-2' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.1//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-2.dtd">',
'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">',
'svg11-basic' =>
'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd">',
'svg11-tiny' =>
'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">',
'xhtml-math-svg-xh' =>
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
'xhtml-math-svg-sh' =>
'<!DOCTYPE svg:svg PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
'xhtml-rdfa-1' =>
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">',
'xhtml-rdfa-2' =>
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.1//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-2.dtd">',
]; ];
} }

View File

@ -28,20 +28,15 @@ class Generators extends BaseConfig
* @var array<string, string> * @var array<string, string>
*/ */
public array $views = [ public array $views = [
'make:command' => 'make:command' => 'CodeIgniter\Commands\Generators\Views\command.tpl.php',
'CodeIgniter\Commands\Generators\Views\command.tpl.php',
'make:config' => 'CodeIgniter\Commands\Generators\Views\config.tpl.php', 'make:config' => 'CodeIgniter\Commands\Generators\Views\config.tpl.php',
'make:controller' => 'make:controller' => 'CodeIgniter\Commands\Generators\Views\controller.tpl.php',
'CodeIgniter\Commands\Generators\Views\controller.tpl.php',
'make:entity' => 'CodeIgniter\Commands\Generators\Views\entity.tpl.php', 'make:entity' => 'CodeIgniter\Commands\Generators\Views\entity.tpl.php',
'make:filter' => 'CodeIgniter\Commands\Generators\Views\filter.tpl.php', 'make:filter' => 'CodeIgniter\Commands\Generators\Views\filter.tpl.php',
'make:migration' => 'make:migration' => 'CodeIgniter\Commands\Generators\Views\migration.tpl.php',
'CodeIgniter\Commands\Generators\Views\migration.tpl.php',
'make:model' => 'CodeIgniter\Commands\Generators\Views\model.tpl.php', 'make:model' => 'CodeIgniter\Commands\Generators\Views\model.tpl.php',
'make:seeder' => 'CodeIgniter\Commands\Generators\Views\seeder.tpl.php', 'make:seeder' => 'CodeIgniter\Commands\Generators\Views\seeder.tpl.php',
'make:validation' => 'make:validation' => 'CodeIgniter\Commands\Generators\Views\validation.tpl.php',
'CodeIgniter\Commands\Generators\Views\validation.tpl.php', 'session:migration' => 'CodeIgniter\Commands\Generators\Views\migration.tpl.php',
'session:migration' =>
'CodeIgniter\Commands\Generators\Views\migration.tpl.php',
]; ];
} }

View File

@ -199,8 +199,7 @@ class Images extends BaseConfig
'medium' => [ 'medium' => [
'width' => 320, 'width' => 320,
'height' => 320, 'height' => 320,
'mimetype' => 'mimetype' => 'image/webp',
'image/webp',
'extension' => 'webp', 'extension' => 'webp',
], ],
]; ];

View File

@ -51,10 +51,8 @@ class CreditsController extends BaseController
'persons' => [ 'persons' => [
$personId => [ $personId => [
'full_name' => $credit->person->full_name, 'full_name' => $credit->person->full_name,
'thumbnail_url' => 'thumbnail_url' => get_avatar_url($credit->person, 'thumbnail'),
get_avatar_url($credit->person, 'thumbnail'), 'information_url' => $credit->person->information_url,
'information_url' =>
$credit->person->information_url,
'roles' => [ 'roles' => [
$personRole => [ $personRole => [
'role_label' => $credit->role_label, 'role_label' => $credit->role_label,
@ -89,8 +87,7 @@ class CreditsController extends BaseController
$personRole = $credit->person_role; $personRole = $credit->person_role;
$credits[$personGroup]['persons'][$personId] = [ $credits[$personGroup]['persons'][$personId] = [
'full_name' => $credit->person->full_name, 'full_name' => $credit->person->full_name,
'thumbnail_url' => 'thumbnail_url' => get_avatar_url($credit->person, 'thumbnail'),
get_avatar_url($credit->person, 'thumbnail'),
'information_url' => $credit->person->information_url, 'information_url' => $credit->person->information_url,
'roles' => [ 'roles' => [
$personRole => [ $personRole => [

View File

@ -229,8 +229,7 @@ class EpisodeController extends BaseController
'provider_url' => $this->podcast->link, 'provider_url' => $this->podcast->link,
'author_name' => $this->podcast->title, 'author_name' => $this->podcast->title,
'author_url' => $this->podcast->link, 'author_url' => $this->podcast->link,
'html' => 'html' => '<iframe src="' .
'<iframe src="' .
$this->episode->embed_url . $this->episode->embed_url .
'" width="100%" height="' . config('Embed')->height . '" frameborder="0" scrolling="no"></iframe>', '" width="100%" height="' . config('Embed')->height . '" frameborder="0" scrolling="no"></iframe>',
'width' => config('Embed') 'width' => config('Embed')

View File

@ -217,8 +217,7 @@ class PodcastController extends BaseController
$episodesNavigation[] = [ $episodesNavigation[] = [
'label' => $year['year'], 'label' => $year['year'],
'number_of_episodes' => $year['number_of_episodes'], 'number_of_episodes' => $year['number_of_episodes'],
'route' => 'route' => route_to('podcast-episodes', $this->podcast->handle) .
route_to('podcast-episodes', $this->podcast->handle) .
'?year=' . '?year=' .
$year['year'], $year['year'],
'is_active' => $isActive, 'is_active' => $isActive,
@ -243,8 +242,7 @@ class PodcastController extends BaseController
'seasonNumber' => $season['season_number'], 'seasonNumber' => $season['season_number'],
]), ]),
'number_of_episodes' => $season['number_of_episodes'], 'number_of_episodes' => $season['number_of_episodes'],
'route' => 'route' => route_to('podcast-episodes', $this->podcast->handle) .
route_to('podcast-episodes', $this->podcast->handle) .
'?season=' . '?season=' .
$season['season_number'], $season['season_number'],
'is_active' => $isActive, 'is_active' => $isActive,

View File

@ -118,15 +118,13 @@ class AddPodcasts extends Migration
'imported_feed_url' => [ 'imported_feed_url' => [
'type' => 'VARCHAR', 'type' => 'VARCHAR',
'constraint' => 512, 'constraint' => 512,
'comment' => 'comment' => 'The RSS feed URL if this podcast was imported, NULL otherwise.',
'The RSS feed URL if this podcast was imported, NULL otherwise.',
'null' => true, 'null' => true,
], ],
'new_feed_url' => [ 'new_feed_url' => [
'type' => 'VARCHAR', 'type' => 'VARCHAR',
'constraint' => 512, 'constraint' => 512,
'comment' => 'comment' => 'The RSS new feed URL if this podcast is moving out, NULL otherwise.',
'The RSS new feed URL if this podcast is moving out, NULL otherwise.',
'null' => true, 'null' => true,
], ],
'payment_pointer' => [ 'payment_pointer' => [

View File

@ -38,8 +38,7 @@ class AddPersons extends Migration
'information_url' => [ 'information_url' => [
'type' => 'VARCHAR', 'type' => 'VARCHAR',
'constraint' => 512, 'constraint' => 512,
'comment' => 'comment' => 'The url to a relevant resource of information about the person, such as a homepage or third-party profile platform.',
'The url to a relevant resource of information about the person, such as a homepage or third-party profile platform.',
'null' => true, 'null' => true,
], ],
'avatar_id' => [ 'avatar_id' => [

View File

@ -240,8 +240,7 @@ class FakeWebsiteAnalyticsSeeder extends Seeder
$websiteByReferer[] = [ $websiteByReferer[] = [
'podcast_id' => $podcast->id, 'podcast_id' => $podcast->id,
'date' => date('Y-m-d', $date), 'date' => date('Y-m-d', $date),
'referer_url' => 'referer_url' => 'http://' . $domain . '/?q=' . $keyword,
'http://' . $domain . '/?q=' . $keyword,
'domain' => $domain, 'domain' => $domain,
'keywords' => $keyword, 'keywords' => $keyword,
'hits' => $hits, 'hits' => $hits,

View File

@ -290,8 +290,7 @@ class LanguageSeeder extends Seeder
], ],
[ [
'code' => 'ie', 'code' => 'ie',
'native_name' => 'native_name' => 'Interlingue, formerly Occidental',
'Interlingue, formerly Occidental',
], ],
[ [
'code' => 'ig', 'code' => 'ig',

View File

@ -38,8 +38,7 @@ class PlatformSeeder extends Seeder
'type' => 'podcasting', 'type' => 'podcasting',
'label' => 'Apple Podcasts', 'label' => 'Apple Podcasts',
'home_url' => 'https://www.apple.com/itunes/podcasts/', 'home_url' => 'https://www.apple.com/itunes/podcasts/',
'submit_url' => 'submit_url' => 'https://podcastsconnect.apple.com/my-podcasts/new-feed',
'https://podcastsconnect.apple.com/my-podcasts/new-feed',
], ],
[ [
'slug' => 'blubrry', 'slug' => 'blubrry',
@ -60,8 +59,7 @@ class PlatformSeeder extends Seeder
'type' => 'podcasting', 'type' => 'podcasting',
'label' => 'Castbox', 'label' => 'Castbox',
'home_url' => 'https://castbox.fm/', 'home_url' => 'https://castbox.fm/',
'submit_url' => 'submit_url' => 'https://helpcenter.castbox.fm/portal/kb/articles/submit-my-podcast',
'https://helpcenter.castbox.fm/portal/kb/articles/submit-my-podcast',
], ],
[ [
'slug' => 'castopod', 'slug' => 'castopod',
@ -75,8 +73,7 @@ class PlatformSeeder extends Seeder
'type' => 'podcasting', 'type' => 'podcasting',
'label' => 'Castro', 'label' => 'Castro',
'home_url' => 'http://castro.fm/', 'home_url' => 'http://castro.fm/',
'submit_url' => 'submit_url' => 'https://castro.fm/support/link-to-your-podcast-in-castro',
'https://castro.fm/support/link-to-your-podcast-in-castro',
], ],
[ [
'slug' => 'chartable', 'slug' => 'chartable',
@ -104,8 +101,7 @@ class PlatformSeeder extends Seeder
'type' => 'podcasting', 'type' => 'podcasting',
'label' => 'Google Podcasts', 'label' => 'Google Podcasts',
'home_url' => 'https://podcasts.google.com/about', 'home_url' => 'https://podcasts.google.com/about',
'submit_url' => 'submit_url' => 'https://search.google.com/search-console/about',
'https://search.google.com/search-console/about',
], ],
[ [
'slug' => 'ivoox', 'slug' => 'ivoox',
@ -210,8 +206,7 @@ class PlatformSeeder extends Seeder
'type' => 'podcasting', 'type' => 'podcasting',
'label' => 'Podverse', 'label' => 'Podverse',
'home_url' => 'https://podverse.fm/', 'home_url' => 'https://podverse.fm/',
'submit_url' => 'submit_url' => 'https://docs.google.com/forms/d/e/1FAIpQLSdewKP-YrE8zGjDPrkmoJEwCxPl_gizEkmzAlTYsiWAuAk1Ng/viewform',
'https://docs.google.com/forms/d/e/1FAIpQLSdewKP-YrE8zGjDPrkmoJEwCxPl_gizEkmzAlTYsiWAuAk1Ng/viewform',
], ],
[ [
'slug' => 'radiopublic', 'slug' => 'radiopublic',
@ -246,8 +241,7 @@ class PlatformSeeder extends Seeder
'type' => 'podcasting', 'type' => 'podcasting',
'label' => 'TuneIn', 'label' => 'TuneIn',
'home_url' => 'https://tunein.com/', 'home_url' => 'https://tunein.com/',
'submit_url' => 'submit_url' => 'https://help.tunein.com/contact/add-podcast-S19TR3Sdf',
'https://help.tunein.com/contact/add-podcast-S19TR3Sdf',
], ],
[ [
'slug' => 'anytime', 'slug' => 'anytime',
@ -453,8 +447,7 @@ class PlatformSeeder extends Seeder
'type' => 'funding', 'type' => 'funding',
'label' => 'KissKissBankBank', 'label' => 'KissKissBankBank',
'home_url' => 'https://www.kisskissbankbank.com/', 'home_url' => 'https://www.kisskissbankbank.com/',
'submit_url' => 'submit_url' => 'https://www.kisskissbankbank.com/en/financer-mon-projet',
'https://www.kisskissbankbank.com/en/financer-mon-projet',
], ],
[ [
'slug' => 'liberapay', 'slug' => 'liberapay',
@ -499,8 +492,7 @@ class PlatformSeeder extends Seeder
'type' => 'social', 'type' => 'social',
'label' => 'Facebook', 'label' => 'Facebook',
'home_url' => 'https://www.facebook.com/', 'home_url' => 'https://www.facebook.com/',
'submit_url' => 'submit_url' => 'https://www.facebook.com/pages/creation/?ref_type=comet_home',
'https://www.facebook.com/pages/creation/?ref_type=comet_home',
], ],
[ [
'slug' => 'funkwhale', 'slug' => 'funkwhale',
@ -514,8 +506,7 @@ class PlatformSeeder extends Seeder
'type' => 'social', 'type' => 'social',
'label' => 'Instagram', 'label' => 'Instagram',
'home_url' => 'https://www.instagram.com/', 'home_url' => 'https://www.instagram.com/',
'submit_url' => 'submit_url' => 'https://www.instagram.com/accounts/emailsignup/',
'https://www.instagram.com/accounts/emailsignup/',
], ],
[ [
'slug' => 'linkedin', 'slug' => 'linkedin',

View File

@ -57,8 +57,7 @@ if (! function_exists('data_table')) {
$template = [ $template = [
'table_open' => '<table class="w-full whitespace-nowrap">', 'table_open' => '<table class="w-full whitespace-nowrap">',
'thead_open' => 'thead_open' => '<thead class="text-xs font-semibold text-left uppercase text-skin-muted">',
'<thead class="text-xs font-semibold text-left uppercase text-skin-muted">',
'heading_cell_start' => '<th class="px-4 py-2">', 'heading_cell_start' => '<th class="px-4 py-2">',
'cell_start' => '<td class="px-4 py-2">', 'cell_start' => '<td class="px-4 py-2">',
@ -300,8 +299,7 @@ if (! function_exists('location_link')) {
$location->url, $location->url,
icon('map-pin', 'mr-2 flex-shrink-0') . '<span class="truncate">' . esc($location->name) . '</span>', icon('map-pin', 'mr-2 flex-shrink-0') . '<span class="truncate">' . esc($location->name) . '</span>',
[ [
'class' => 'class' => 'w-full overflow-hidden inline-flex items-baseline hover:underline focus:ring-accent' .
'w-full overflow-hidden inline-flex items-baseline hover:underline focus:ring-accent' .
($class === '' ? '' : " {$class}"), ($class === '' ? '' : " {$class}"),
'target' => '_blank', 'target' => '_blank',
'rel' => 'noreferrer noopener', 'rel' => 'noreferrer noopener',

View File

@ -24,8 +24,7 @@ class EpisodeModel extends Model
*/ */
public static $themes = [ public static $themes = [
'light-transparent' => [ 'light-transparent' => [
'style' => 'style' => 'background-color: #fff; background-image: linear-gradient(45deg, #ccc 12.5%, transparent 12.5%, transparent 50%, #ccc 50%, #ccc 62.5%, transparent 62.5%, transparent 100%); background-size: 5.66px 5.66px;',
'background-color: #fff; background-image: linear-gradient(45deg, #ccc 12.5%, transparent 12.5%, transparent 50%, #ccc 50%, #ccc 62.5%, transparent 62.5%, transparent 100%); background-size: 5.66px 5.66px;',
'background' => 'transparent', 'background' => 'transparent',
'text' => '#000', 'text' => '#000',
'inverted' => '#fff', 'inverted' => '#fff',
@ -37,8 +36,7 @@ class EpisodeModel extends Model
'inverted' => '#fff', 'inverted' => '#fff',
], ],
'dark-transparent' => [ 'dark-transparent' => [
'style' => 'style' => 'background-color: #001f1a; background-image: linear-gradient(45deg, #888 12.5%, transparent 12.5%, transparent 50%, #888 50%, #888 62.5%, transparent 62.5%, transparent 100%); background-size: 5.66px 5.66px;',
'background-color: #001f1a; background-image: linear-gradient(45deg, #888 12.5%, transparent 12.5%, transparent 50%, #888 50%, #888 62.5%, transparent 62.5%, transparent 100%); background-size: 5.66px 5.66px;',
'background' => 'transparent', 'background' => 'transparent',
'text' => '#fff', 'text' => '#fff',
'inverted' => '#000', 'inverted' => '#000',

View File

@ -50,8 +50,7 @@ class PageModel extends Model
*/ */
protected $validationRules = [ protected $validationRules = [
'title' => 'required', 'title' => 'required',
'slug' => 'slug' => 'required|regex_match[/^[a-zA-Z0-9\-]{1,128}$/]|is_unique[pages.slug,id,{id}]',
'required|regex_match[/^[a-zA-Z0-9\-]{1,128}$/]|is_unique[pages.slug,id,{id}]',
'content_markdown' => 'required', 'content_markdown' => 'required',
]; ];

View File

@ -58,8 +58,7 @@ class PersonModel extends Model
*/ */
protected $validationRules = [ protected $validationRules = [
'full_name' => 'required', 'full_name' => 'required',
'unique_name' => 'unique_name' => 'required|regex_match[/^[a-z0-9\-]{1,32}$/]|is_unique[persons.unique_name,id,{id}]',
'required|regex_match[/^[a-z0-9\-]{1,32}$/]|is_unique[persons.unique_name,id,{id}]',
'created_by' => 'required', 'created_by' => 'required',
'updated_by' => 'required', 'updated_by' => 'required',
]; ];

View File

@ -85,8 +85,7 @@ class PodcastModel extends Model
*/ */
protected $validationRules = [ protected $validationRules = [
'title' => 'required', 'title' => 'required',
'handle' => 'handle' => 'required|regex_match[/^[a-zA-Z0-9\_]{1,32}$/]|is_unique[podcasts.handle,id,{id}]',
'required|regex_match[/^[a-zA-Z0-9\_]{1,32}$/]|is_unique[podcasts.handle,id,{id}]',
'description_markdown' => 'required', 'description_markdown' => 'required',
'cover_id' => 'required', 'cover_id' => 'required',
'language_code' => 'required', 'language_code' => 'required',

View File

@ -84,14 +84,14 @@ class Button extends Component
if ($this->iconLeft !== '') { if ($this->iconLeft !== '') {
$this->slot = (new Icon([ $this->slot = (new Icon([
'glyph' => $this->iconLeft, 'glyph' => $this->iconLeft,
'class' => 'opacity-75' . ' ' . $iconSize[$this->size], 'class' => 'opacity-75 ' . $iconSize[$this->size],
]))->render() . $this->slot; ]))->render() . $this->slot;
} }
if ($this->iconRight !== '') { if ($this->iconRight !== '') {
$this->slot .= (new Icon([ $this->slot .= (new Icon([
'glyph' => $this->iconRight, 'glyph' => $this->iconRight,
'class' => 'opacity-75' . ' ' . $iconSize[$this->size], 'class' => 'opacity-75 ' . $iconSize[$this->size],
]))->render(); ]))->render();
} }

View File

@ -19,20 +19,20 @@
"adaures/podcast-persons-taxonomy": "^v1.0.0", "adaures/podcast-persons-taxonomy": "^v1.0.0",
"phpseclib/phpseclib": "~2.0.42", "phpseclib/phpseclib": "~2.0.42",
"michalsn/codeigniter4-uuid": "dev-develop", "michalsn/codeigniter4-uuid": "dev-develop",
"codeigniter4/settings": "^v2.1.0", "codeigniter4/settings": "v2.1.2",
"chrisjean/php-ico": "^1.0.4", "chrisjean/php-ico": "^1.0.4",
"melbahja/seo": "^v2.1.1", "melbahja/seo": "^v2.1.1",
"codeigniter4/shield": "v1.0.0-beta.3", "codeigniter4/shield": "v1.0.0-beta.3",
"aws/aws-sdk-php": "^3.269.7", "aws/aws-sdk-php": "^3.272.1",
"mpratt/embera": "^2.0.32" "mpratt/embera": "^2.0.33"
}, },
"require-dev": { "require-dev": {
"mikey179/vfsstream": "^v1.6.11", "mikey179/vfsstream": "^v1.6.11",
"phpunit/phpunit": "^10.1.2", "phpunit/phpunit": "^10.2.2",
"captainhook/captainhook": "^5.16.4", "captainhook/captainhook": "^5.16.4",
"symplify/easy-coding-standard": "^11.3.2", "symplify/easy-coding-standard": "^11.3.4",
"phpstan/phpstan": "^1.10.13", "phpstan/phpstan": "^1.10.18",
"rector/rector": "^0.16.0", "rector/rector": "^0.17.0",
"symplify/coding-standard": "^11.3.0" "symplify/coding-standard": "^11.3.0"
}, },
"autoload": { "autoload": {

374
composer.lock generated

File diff suppressed because it is too large Load Diff

11
ecs.php
View File

@ -3,6 +3,7 @@
declare(strict_types=1); declare(strict_types=1);
use PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis\AssignmentInConditionSniff; use PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis\AssignmentInConditionSniff;
use PhpCsFixer\Fixer\Operator\BinaryOperatorSpacesFixer;
use PhpCsFixer\Fixer\StringNotation\SingleQuoteFixer; use PhpCsFixer\Fixer\StringNotation\SingleQuoteFixer;
use PhpCsFixer\Fixer\Whitespace\IndentationTypeFixer; use PhpCsFixer\Fixer\Whitespace\IndentationTypeFixer;
use Symplify\CodingStandard\Fixer\LineLength\LineLengthFixer; use Symplify\CodingStandard\Fixer\LineLength\LineLengthFixer;
@ -25,6 +26,8 @@ return static function (ECSConfig $ecsConfig): void {
__DIR__ . '/spark', __DIR__ . '/spark',
]); ]);
$ecsConfig->sets([SetList::CLEAN_CODE, SetList::COMMON, SetList::SYMPLIFY, SetList::PSR_12]);
$ecsConfig->skip([ $ecsConfig->skip([
// skip specific generated files // skip specific generated files
__DIR__ . '/modules/Admin/Language/*/PersonsTaxonomy.php', __DIR__ . '/modules/Admin/Language/*/PersonsTaxonomy.php',
@ -52,8 +55,14 @@ return static function (ECSConfig $ecsConfig): void {
// remove SingleQuoteFixer for Language files to prevent conflicts // remove SingleQuoteFixer for Language files to prevent conflicts
SingleQuoteFixer::class => [__DIR__ . '/app/Language/*', __DIR__ . '/modules/**/Language/*'], SingleQuoteFixer::class => [__DIR__ . '/app/Language/*', __DIR__ . '/modules/**/Language/*'],
BinaryOperatorSpacesFixer::class => [__DIR__ . '/app/Language/*', __DIR__ . '/modules/**/Language/*'],
AssignmentInConditionSniff::class, AssignmentInConditionSniff::class,
]); ]);
$ecsConfig->sets([SetList::PSR_12, SetList::SYMPLIFY, SetList::COMMON, SetList::CLEAN_CODE]); $ecsConfig->ruleWithConfiguration(BinaryOperatorSpacesFixer::class, [
'operators' => [
'=>' => 'align_single_space_minimal',
],
]);
}; };

View File

@ -120,16 +120,14 @@ $routes->group(
'PodcastController::publish/$1', 'PodcastController::publish/$1',
[ [
'as' => 'podcast-publish', 'as' => 'podcast-publish',
'filter' => 'filter' => 'permission:podcast#.manage-publications',
'permission:podcast#.manage-publications',
], ],
); );
$routes->post( $routes->post(
'publish', 'publish',
'PodcastController::attemptPublish/$1', 'PodcastController::attemptPublish/$1',
[ [
'filter' => 'filter' => 'permission:podcast#.manage-publications',
'permission:podcast#.manage-publications',
], ],
); );
$routes->get( $routes->get(
@ -137,16 +135,14 @@ $routes->group(
'PodcastController::publishEdit/$1', 'PodcastController::publishEdit/$1',
[ [
'as' => 'podcast-publish_edit', 'as' => 'podcast-publish_edit',
'filter' => 'filter' => 'permission:podcast#.manage-publications',
'permission:podcast#.manage-publications',
], ],
); );
$routes->post( $routes->post(
'publish-edit', 'publish-edit',
'PodcastController::attemptPublishEdit/$1', 'PodcastController::attemptPublishEdit/$1',
[ [
'filter' => 'filter' => 'permission:podcast#.manage-publications',
'permission:podcast#.manage-publications',
], ],
); );
$routes->get( $routes->get(
@ -154,8 +150,7 @@ $routes->group(
'PodcastController::publishCancel/$1', 'PodcastController::publishCancel/$1',
[ [
'as' => 'podcast-publish-cancel', 'as' => 'podcast-publish-cancel',
'filter' => 'filter' => 'permission:podcast#.manage-publications',
'permission:podcast#.manage-publications',
], ],
); );
$routes->get('edit/delete-banner', 'PodcastController::deleteBanner/$1', [ $routes->get('edit/delete-banner', 'PodcastController::deleteBanner/$1', [
@ -252,8 +247,7 @@ $routes->group(
$routes->group('episodes', static function ($routes): void { $routes->group('episodes', static function ($routes): void {
$routes->get('/', 'EpisodeController::list/$1', [ $routes->get('/', 'EpisodeController::list/$1', [
'as' => 'episode-list', 'as' => 'episode-list',
'filter' => 'filter' => 'permission:podcast#.episodes.view',
'permission:podcast#.episodes.view',
]); ]);
$routes->get('new', 'EpisodeController::create/$1', [ $routes->get('new', 'EpisodeController::create/$1', [
'as' => 'episode-create', 'as' => 'episode-create',
@ -270,8 +264,7 @@ $routes->group(
$routes->group('(:num)', static function ($routes): void { $routes->group('(:num)', static function ($routes): void {
$routes->get('/', 'EpisodeController::view/$1/$2', [ $routes->get('/', 'EpisodeController::view/$1/$2', [
'as' => 'episode-view', 'as' => 'episode-view',
'filter' => 'filter' => 'permission:podcast#.episodes.view',
'permission:podcast#.episodes.view',
]); ]);
$routes->get('edit', 'EpisodeController::edit/$1/$2', [ $routes->get('edit', 'EpisodeController::edit/$1/$2', [
'as' => 'episode-edit', 'as' => 'episode-edit',
@ -289,16 +282,14 @@ $routes->group(
'EpisodeController::publish/$1/$2', 'EpisodeController::publish/$1/$2',
[ [
'as' => 'episode-publish', 'as' => 'episode-publish',
'filter' => 'filter' => 'permission:podcast#.episodes.manage-publications',
'permission:podcast#.episodes.manage-publications',
], ],
); );
$routes->post( $routes->post(
'publish', 'publish',
'EpisodeController::attemptPublish/$1/$2', 'EpisodeController::attemptPublish/$1/$2',
[ [
'filter' => 'filter' => 'permission:podcast#.episodes.manage-publications',
'permission:podcast#.episodes.manage-publications',
], ],
); );
$routes->get( $routes->get(
@ -306,16 +297,14 @@ $routes->group(
'EpisodeController::publishEdit/$1/$2', 'EpisodeController::publishEdit/$1/$2',
[ [
'as' => 'episode-publish_edit', 'as' => 'episode-publish_edit',
'filter' => 'filter' => 'permission:podcast#.episodes.manage-publications',
'permission:podcast#.episodes.manage-publications',
], ],
); );
$routes->post( $routes->post(
'publish-edit', 'publish-edit',
'EpisodeController::attemptPublishEdit/$1/$2', 'EpisodeController::attemptPublishEdit/$1/$2',
[ [
'filter' => 'filter' => 'permission:podcast#.episodes.manage-publications',
'permission:podcast#.episodes.manage-publications',
], ],
); );
$routes->get( $routes->get(
@ -323,8 +312,7 @@ $routes->group(
'EpisodeController::publishCancel/$1/$2', 'EpisodeController::publishCancel/$1/$2',
[ [
'as' => 'episode-publish-cancel', 'as' => 'episode-publish-cancel',
'filter' => 'filter' => 'permission:podcast#.episodes.manage-publications',
'permission:podcast#.episodes.manage-publications',
], ],
); );
$routes->get( $routes->get(
@ -332,16 +320,14 @@ $routes->group(
'EpisodeController::publishDateEdit/$1/$2', 'EpisodeController::publishDateEdit/$1/$2',
[ [
'as' => 'episode-publish_date_edit', 'as' => 'episode-publish_date_edit',
'filter' => 'filter' => 'permission:podcast#.episodes.manage-publications',
'permission:podcast#.episodes.manage-publications',
], ],
); );
$routes->post( $routes->post(
'publish-date-edit', 'publish-date-edit',
'EpisodeController::attemptPublishDateEdit/$1/$2', 'EpisodeController::attemptPublishDateEdit/$1/$2',
[ [
'filter' => 'filter' => 'permission:podcast#.episodes.manage-publications',
'permission:podcast#.episodes.manage-publications',
], ],
); );
$routes->get( $routes->get(
@ -349,16 +335,14 @@ $routes->group(
'EpisodeController::unpublish/$1/$2', 'EpisodeController::unpublish/$1/$2',
[ [
'as' => 'episode-unpublish', 'as' => 'episode-unpublish',
'filter' => 'filter' => 'permission:podcast#.episodes.manage-publications',
'permission:podcast#.episodes.manage-publications',
], ],
); );
$routes->post( $routes->post(
'unpublish', 'unpublish',
'EpisodeController::attemptUnpublish/$1/$2', 'EpisodeController::attemptUnpublish/$1/$2',
[ [
'filter' => 'filter' => 'permission:podcast#.episodes.manage-publications',
'permission:podcast#.episodes.manage-publications',
], ],
); );
$routes->get( $routes->get(
@ -366,16 +350,14 @@ $routes->group(
'EpisodeController::delete/$1/$2', 'EpisodeController::delete/$1/$2',
[ [
'as' => 'episode-delete', 'as' => 'episode-delete',
'filter' => 'filter' => 'permission:podcast#.episodes.delete',
'permission:podcast#.episodes.delete',
], ],
); );
$routes->post( $routes->post(
'delete', 'delete',
'EpisodeController::attemptDelete/$1/$2', 'EpisodeController::attemptDelete/$1/$2',
[ [
'filter' => 'filter' => 'permission:podcast#.episodes.delete',
'permission:podcast#.episodes.delete',
], ],
); );
$routes->get( $routes->get(
@ -491,8 +473,7 @@ $routes->group(
'/', '/',
'EpisodePersonController::attemptAdd/$1/$2', 'EpisodePersonController::attemptAdd/$1/$2',
[ [
'filter' => 'filter' => 'permission:podcast#.episodes.manage-persons',
'permission:podcast#.episodes.manage-persons',
], ],
); );
$routes->get( $routes->get(
@ -500,8 +481,7 @@ $routes->group(
'EpisodePersonController::remove/$1/$2/$3', 'EpisodePersonController::remove/$1/$2/$3',
[ [
'as' => 'episode-person-remove', 'as' => 'episode-person-remove',
'filter' => 'filter' => 'permission:podcast#.episodes.manage-persons',
'permission:podcast#.episodes.manage-persons',
], ],
); );
}); });

View File

@ -135,7 +135,10 @@ class EpisodeController extends BaseController
$data = [ $data = [
'podcast' => $this->podcast, 'podcast' => $this->podcast,
'currentSeasonNumber' => $currentSeasonNumber, 'currentSeasonNumber' => $currentSeasonNumber,
'nextEpisodeNumber' => (new EpisodeModel())->getNextEpisodeNumber($this->podcast->id, $currentSeasonNumber), 'nextEpisodeNumber' => (new EpisodeModel())->getNextEpisodeNumber(
$this->podcast->id,
$currentSeasonNumber
),
]; ];
replace_breadcrumb_params([ replace_breadcrumb_params([
0 => $this->podcast->at_handle, 0 => $this->podcast->at_handle,
@ -148,10 +151,8 @@ class EpisodeController extends BaseController
$rules = [ $rules = [
'slug' => 'max_length[128]', 'slug' => 'max_length[128]',
'audio_file' => 'uploaded[audio_file]|ext_in[audio_file,mp3,m4a]', 'audio_file' => 'uploaded[audio_file]|ext_in[audio_file,mp3,m4a]',
'cover' => 'cover' => 'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]',
'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', 'transcript_file' => 'ext_in[transcript,srt]|permit_empty',
'transcript_file' =>
'ext_in[transcript,srt]|permit_empty',
'chapters_file' => 'ext_in[chapters,json]|permit_empty', 'chapters_file' => 'ext_in[chapters,json]|permit_empty',
]; ];
@ -189,13 +190,12 @@ class EpisodeController extends BaseController
'audio' => $this->request->getFile('audio_file'), 'audio' => $this->request->getFile('audio_file'),
'cover' => $this->request->getFile('cover'), 'cover' => $this->request->getFile('cover'),
'description_markdown' => $this->request->getPost('description'), 'description_markdown' => $this->request->getPost('description'),
'location' => $this->request->getPost('location_name') === '' ? null : new Location($this->request->getPost( 'location' => $this->request->getPost('location_name') === '' ? null : new Location(
'location_name' $this->request->getPost('location_name')
)), ),
'transcript' => $this->request->getFile('transcript'), 'transcript' => $this->request->getFile('transcript'),
'chapters' => $this->request->getFile('chapters'), 'chapters' => $this->request->getFile('chapters'),
'parental_advisory' => 'parental_advisory' => $this->request->getPost('parental_advisory') !== 'undefined'
$this->request->getPost('parental_advisory') !== 'undefined'
? $this->request->getPost('parental_advisory') ? $this->request->getPost('parental_advisory')
: null, : null,
'number' => $this->request->getPost('episode_number') 'number' => $this->request->getPost('episode_number')
@ -285,12 +285,9 @@ class EpisodeController extends BaseController
{ {
$rules = [ $rules = [
'slug' => 'max_length[128]', 'slug' => 'max_length[128]',
'audio_file' => 'audio_file' => 'uploaded[audio_file]|ext_in[audio_file,mp3,m4a]|permit_empty',
'uploaded[audio_file]|ext_in[audio_file,mp3,m4a]|permit_empty', 'cover' => 'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]',
'cover' => 'transcript_file' => 'ext_in[transcript_file,txt,html,srt,json]|permit_empty',
'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]',
'transcript_file' =>
'ext_in[transcript_file,txt,html,srt,json]|permit_empty',
'chapters_file' => 'ext_in[chapters_file,json]|permit_empty', 'chapters_file' => 'ext_in[chapters_file,json]|permit_empty',
]; ];
@ -470,8 +467,7 @@ class EpisodeController extends BaseController
if ($this->podcast->publication_status === 'published') { if ($this->podcast->publication_status === 'published') {
$rules = [ $rules = [
'publication_method' => 'required', 'publication_method' => 'required',
'scheduled_publication_date' => 'scheduled_publication_date' => 'valid_date[Y-m-d H:i]|permit_empty',
'valid_date[Y-m-d H:i]|permit_empty',
]; ];
if (! $this->validate($rules)) { if (! $this->validate($rules)) {
@ -584,8 +580,7 @@ class EpisodeController extends BaseController
$rules = [ $rules = [
'post_id' => 'required', 'post_id' => 'required',
'publication_method' => 'required', 'publication_method' => 'required',
'scheduled_publication_date' => 'scheduled_publication_date' => 'valid_date[Y-m-d H:i]|permit_empty',
'valid_date[Y-m-d H:i]|permit_empty',
]; ];
if (! $this->validate($rules)) { if (! $this->validate($rules)) {
@ -934,13 +929,19 @@ class EpisodeController extends BaseController
//remove episode media files from disk //remove episode media files from disk
foreach ($episodeMediaList as $episodeMedia) { foreach ($episodeMediaList as $episodeMedia) {
if ($episodeMedia !== null && ! $episodeMedia->deleteFile()) { if ($episodeMedia === null) {
continue;
}
if ($episodeMedia->deleteFile()) {
continue;
}
$warnings[] = lang('Episode.messages.deleteFileError', [ $warnings[] = lang('Episode.messages.deleteFileError', [
'type' => $episodeMedia->type, 'type' => $episodeMedia->type,
'file_key' => $episodeMedia->file_key, 'file_key' => $episodeMedia->file_key,
]); ]);
} }
}
if ($warnings !== []) { if ($warnings !== []) {
return redirect() return redirect()

View File

@ -65,8 +65,7 @@ class PersonController extends BaseController
public function attemptCreate(): RedirectResponse public function attemptCreate(): RedirectResponse
{ {
$rules = [ $rules = [
'avatar' => 'avatar' => 'is_image[avatar]|ext_in[avatar,jpg,jpeg,png]|min_dims[avatar,400,400]|is_image_ratio[avatar,1,1]',
'is_image[avatar]|ext_in[avatar,jpg,jpeg,png]|min_dims[avatar,400,400]|is_image_ratio[avatar,1,1]',
]; ];
if (! $this->validate($rules)) { if (! $this->validate($rules)) {
@ -120,8 +119,7 @@ class PersonController extends BaseController
public function attemptEdit(): RedirectResponse public function attemptEdit(): RedirectResponse
{ {
$rules = [ $rules = [
'avatar' => 'avatar' => 'is_image[avatar]|ext_in[avatar,jpg,jpeg,png]|min_dims[avatar,400,400]|is_image_ratio[avatar,1,1]',
'is_image[avatar]|ext_in[avatar,jpg,jpeg,png]|min_dims[avatar,400,400]|is_image_ratio[avatar,1,1]',
]; ];
if (! $this->validate($rules)) { if (! $this->validate($rules)) {

View File

@ -186,8 +186,7 @@ class PodcastController extends BaseController
public function attemptCreate(): RedirectResponse public function attemptCreate(): RedirectResponse
{ {
$rules = [ $rules = [
'cover' => 'cover' => 'uploaded[cover]|is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]',
'uploaded[cover]|is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]',
'banner' => 'is_image[banner]|ext_in[banner,jpg,jpeg,png]|min_dims[banner,1500,500]|is_image_ratio[banner,3,1]', 'banner' => 'is_image[banner]|ext_in[banner,jpg,jpeg,png]|min_dims[banner,1500,500]|is_image_ratio[banner,3,1]',
]; ];
@ -218,8 +217,7 @@ class PodcastController extends BaseController
'description_markdown' => $this->request->getPost('description'), 'description_markdown' => $this->request->getPost('description'),
'language_code' => $this->request->getPost('language'), 'language_code' => $this->request->getPost('language'),
'category_id' => $this->request->getPost('category'), 'category_id' => $this->request->getPost('category'),
'parental_advisory' => 'parental_advisory' => $this->request->getPost('parental_advisory') !== 'undefined'
$this->request->getPost('parental_advisory') !== 'undefined'
? $this->request->getPost('parental_advisory') ? $this->request->getPost('parental_advisory')
: null, : null,
'owner_name' => $this->request->getPost('owner_name'), 'owner_name' => $this->request->getPost('owner_name'),
@ -227,9 +225,9 @@ class PodcastController extends BaseController
'publisher' => $this->request->getPost('publisher'), 'publisher' => $this->request->getPost('publisher'),
'type' => $this->request->getPost('type'), 'type' => $this->request->getPost('type'),
'copyright' => $this->request->getPost('copyright'), 'copyright' => $this->request->getPost('copyright'),
'location' => $this->request->getPost('location_name') === '' ? null : new Location($this->request->getPost( 'location' => $this->request->getPost('location_name') === '' ? null : new Location(
'location_name' $this->request->getPost('location_name')
)), ),
'payment_pointer' => $this->request->getPost( 'payment_pointer' => $this->request->getPost(
'payment_pointer' 'payment_pointer'
) === '' ? null : $this->request->getPost('payment_pointer'), ) === '' ? null : $this->request->getPost('payment_pointer'),
@ -301,8 +299,7 @@ class PodcastController extends BaseController
public function attemptEdit(): RedirectResponse public function attemptEdit(): RedirectResponse
{ {
$rules = [ $rules = [
'cover' => 'cover' => 'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]',
'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]',
'banner' => 'is_image[banner]|ext_in[banner,jpg,jpeg,png]|min_dims[banner,1500,500]|is_image_ratio[banner,3,1]', 'banner' => 'is_image[banner]|ext_in[banner,jpg,jpeg,png]|min_dims[banner,1500,500]|is_image_ratio[banner,3,1]',
]; ];
@ -641,8 +638,7 @@ class PodcastController extends BaseController
$rules = [ $rules = [
'publication_method' => 'required', 'publication_method' => 'required',
'scheduled_publication_date' => 'scheduled_publication_date' => 'valid_date[Y-m-d H:i]|permit_empty',
'valid_date[Y-m-d H:i]|permit_empty',
]; ];
if (! $this->validate($rules)) { if (! $this->validate($rules)) {
@ -775,8 +771,7 @@ class PodcastController extends BaseController
$rules = [ $rules = [
'publication_method' => 'required', 'publication_method' => 'required',
'scheduled_publication_date' => 'scheduled_publication_date' => 'valid_date[Y-m-d H:i]|permit_empty',
'valid_date[Y-m-d H:i]|permit_empty',
]; ];
if (! $this->validate($rules)) { if (! $this->validate($rules)) {

View File

@ -151,8 +151,7 @@ class PodcastImportController extends BaseController
'banner' => null, 'banner' => null,
'language_code' => $this->request->getPost('language'), 'language_code' => $this->request->getPost('language'),
'category_id' => $this->request->getPost('category'), 'category_id' => $this->request->getPost('category'),
'parental_advisory' => 'parental_advisory' => property_exists($nsItunes, 'explicit') && $nsItunes->explicit !== null
property_exists($nsItunes, 'explicit') && $nsItunes->explicit !== null
? (in_array((string) $nsItunes->explicit, ['yes', 'true'], true) ? (in_array((string) $nsItunes->explicit, ['yes', 'true'], true)
? 'explicit' ? 'explicit'
: (in_array((string) $nsItunes->explicit, ['no', 'false'], true) : (in_array((string) $nsItunes->explicit, ['no', 'false'], true)
@ -167,10 +166,11 @@ class PodcastImportController extends BaseController
'type' 'type'
) && $nsItunes->type !== null ? (string) $nsItunes->type : 'episodic', ) && $nsItunes->type !== null ? (string) $nsItunes->type : 'episodic',
'copyright' => (string) $feed->channel[0]->copyright, 'copyright' => (string) $feed->channel[0]->copyright,
'is_blocked' => 'is_blocked' => property_exists(
property_exists($nsItunes, 'block') && $nsItunes->block !== null && (string) $nsItunes->block === 'yes', $nsItunes,
'is_completed' => 'block'
property_exists( ) && $nsItunes->block !== null && (string) $nsItunes->block === 'yes',
'is_completed' => property_exists(
$nsItunes, $nsItunes,
'complete' 'complete'
) && $nsItunes->complete !== null && (string) $nsItunes->complete === 'yes', ) && $nsItunes->complete !== null && (string) $nsItunes->complete === 'yes',
@ -178,12 +178,12 @@ class PodcastImportController extends BaseController
'created_by' => user_id(), 'created_by' => user_id(),
'updated_by' => user_id(), 'updated_by' => user_id(),
]); ]);
} catch (ErrorException $ex) { } catch (ErrorException $errorException) {
return redirect() return redirect()
->back() ->back()
->withInput() ->withInput()
->with('errors', [ ->with('errors', [
$ex->getMessage() . $errorException->getMessage() .
': <a href="' . ': <a href="' .
$this->request->getPost('imported_feed_url') . $this->request->getPost('imported_feed_url') .
'" rel="noreferrer noopener" target="_blank">' . '" rel="noreferrer noopener" target="_blank">' .
@ -365,20 +365,17 @@ class PodcastImportController extends BaseController
'description_markdown' => $converter->convert($itemDescriptionHtml), 'description_markdown' => $converter->convert($itemDescriptionHtml),
'description_html' => $itemDescriptionHtml, 'description_html' => $itemDescriptionHtml,
'cover' => $episodeCover, 'cover' => $episodeCover,
'parental_advisory' => 'parental_advisory' => property_exists($nsItunes, 'explicit') && $nsItunes->explicit !== null
property_exists($nsItunes, 'explicit') && $nsItunes->explicit !== null
? (in_array((string) $nsItunes->explicit, ['yes', 'true'], true) ? (in_array((string) $nsItunes->explicit, ['yes', 'true'], true)
? 'explicit' ? 'explicit'
: (in_array((string) $nsItunes->explicit, ['no', 'false'], true) : (in_array((string) $nsItunes->explicit, ['no', 'false'], true)
? 'clean' ? 'clean'
: null)) : null))
: null, : null,
'number' => 'number' => $this->request->getPost('force_renumber') === 'yes'
$this->request->getPost('force_renumber') === 'yes'
? $itemNumber ? $itemNumber
: ((string) $nsItunes->episode === '' ? null : (int) $nsItunes->episode), : ((string) $nsItunes->episode === '' ? null : (int) $nsItunes->episode),
'season_number' => 'season_number' => $this->request->getPost('season_number') === ''
$this->request->getPost('season_number') === ''
? ((string) $nsItunes->season === '' ? null : (int) $nsItunes->season) ? ((string) $nsItunes->season === '' ? null : (int) $nsItunes->season)
: (int) $this->request->getPost('season_number'), : (int) $this->request->getPost('season_number'),
'type' => property_exists($nsItunes, 'episodeType') && in_array( 'type' => property_exists($nsItunes, 'episodeType') && in_array(
@ -611,8 +608,7 @@ class PodcastImportController extends BaseController
'description_markdown' => $converter->convert($itemDescriptionHtml), 'description_markdown' => $converter->convert($itemDescriptionHtml),
'description_html' => $itemDescriptionHtml, 'description_html' => $itemDescriptionHtml,
'cover' => $episodeCover, 'cover' => $episodeCover,
'parental_advisory' => 'parental_advisory' => property_exists($nsItunes, 'explicit') && $nsItunes->explicit !== null
property_exists($nsItunes, 'explicit') && $nsItunes->explicit !== null
? (in_array((string) $nsItunes->explicit, ['yes', 'true'], true) ? (in_array((string) $nsItunes->explicit, ['yes', 'true'], true)
? 'explicit' ? 'explicit'
: (in_array((string) $nsItunes->explicit, ['no', 'false'], true) : (in_array((string) $nsItunes->explicit, ['no', 'false'], true)

View File

@ -85,11 +85,12 @@ class PodcastPlatformController extends BaseController
'podcast_id' => $this->podcast->id, 'podcast_id' => $this->podcast->id,
'link_url' => $podcastPlatformUrl, 'link_url' => $podcastPlatformUrl,
'account_id' => $podcastPlatformAccountId === '' ? null : $podcastPlatformAccountId, 'account_id' => $podcastPlatformAccountId === '' ? null : $podcastPlatformAccountId,
'is_visible' => 'is_visible' => array_key_exists('visible', $podcastPlatform) &&
array_key_exists('visible', $podcastPlatform) &&
$podcastPlatform['visible'] === 'yes', $podcastPlatform['visible'] === 'yes',
'is_on_embed' => 'is_on_embed' => array_key_exists(
array_key_exists('on_embed', $podcastPlatform) && $podcastPlatform['on_embed'] === 'yes', 'on_embed',
$podcastPlatform
) && $podcastPlatform['on_embed'] === 'yes',
]; ];
} }

View File

@ -35,8 +35,7 @@ class SettingsController extends BaseController
public function attemptInstanceEdit(): RedirectResponse public function attemptInstanceEdit(): RedirectResponse
{ {
$rules = [ $rules = [
'site_icon' => 'site_icon' => 'is_image[site_icon]|ext_in[site_icon,png,jpeg]|is_image_ratio[site_icon,1,1]|min_dims[image,512,512]|permit_empty',
'is_image[site_icon]|ext_in[site_icon,png,jpeg]|is_image_ratio[site_icon,1,1]|min_dims[image,512,512]|permit_empty',
]; ];
if (! $this->validate($rules)) { if (! $this->validate($rules)) {

View File

@ -77,8 +77,7 @@ $routes->group(
$routes->group('podcasts/(:num)/contributors', static function ($routes): void { $routes->group('podcasts/(:num)/contributors', static function ($routes): void {
$routes->get('/', 'ContributorController::list/$1', [ $routes->get('/', 'ContributorController::list/$1', [
'as' => 'contributor-list', 'as' => 'contributor-list',
'filter' => 'filter' => 'permission:podcast#.manage-contributors',
'permission:podcast#.manage-contributors',
]); ]);
$routes->get('add', 'ContributorController::add/$1', [ $routes->get('add', 'ContributorController::add/$1', [
'as' => 'contributor-add', 'as' => 'contributor-add',
@ -88,32 +87,28 @@ $routes->group(
'add', 'add',
'ContributorController::attemptAdd/$1', 'ContributorController::attemptAdd/$1',
[ [
'filter' => 'filter' => 'permission:podcast#.manage-contributors',
'permission:podcast#.manage-contributors',
], ],
); );
// Contributor // Contributor
$routes->group('(:num)', static function ($routes): void { $routes->group('(:num)', static function ($routes): void {
$routes->get('/', 'ContributorController::view/$1/$2', [ $routes->get('/', 'ContributorController::view/$1/$2', [
'as' => 'contributor-view', 'as' => 'contributor-view',
'filter' => 'filter' => 'permission:podcast#.manage-contributors',
'permission:podcast#.manage-contributors',
]); ]);
$routes->get( $routes->get(
'edit', 'edit',
'ContributorController::edit/$1/$2', 'ContributorController::edit/$1/$2',
[ [
'as' => 'contributor-edit', 'as' => 'contributor-edit',
'filter' => 'filter' => 'permission:podcast#.manage-contributors',
'permission:podcast#.manage-contributors',
], ],
); );
$routes->post( $routes->post(
'edit', 'edit',
'ContributorController::attemptEdit/$1/$2', 'ContributorController::attemptEdit/$1/$2',
[ [
'filter' => 'filter' => 'permission:podcast#.manage-contributors',
'permission:podcast#.manage-contributors',
], ],
); );
$routes->get( $routes->get(
@ -121,16 +116,14 @@ $routes->group(
'ContributorController::remove/$1/$2', 'ContributorController::remove/$1/$2',
[ [
'as' => 'contributor-remove', 'as' => 'contributor-remove',
'filter' => 'filter' => 'permission:podcast#.manage-contributors',
'permission:podcast#.manage-contributors',
], ],
); );
$routes->post( $routes->post(
'remove', 'remove',
'ContributorController::attemptRemove/$1/$2', 'ContributorController::attemptRemove/$1/$2',
[ [
'filter' => 'filter' => 'permission:podcast#.manage-contributors',
'permission:podcast#.manage-contributors',
], ],
); );
}); });

View File

@ -25,7 +25,7 @@ class PermissionFilter implements FilterInterface
*/ */
public function before(RequestInterface $request, $params = null) public function before(RequestInterface $request, $params = null)
{ {
if (empty($params)) { if ($params === null || $params === []) {
return; return;
} }

View File

@ -40,8 +40,7 @@ $routes->group('', [
]); ]);
$routes->post('inbox', 'ActorController::inbox/$1', [ $routes->post('inbox', 'ActorController::inbox/$1', [
'as' => 'inbox', 'as' => 'inbox',
'filter' => 'filter' => 'fediverse:verify-activitystream,verify-blocks,verify-signature',
'fediverse:verify-activitystream,verify-blocks,verify-signature',
]); ]);
$routes->get('outbox', 'ActorController::outbox/$1', [ $routes->get('outbox', 'ActorController::outbox/$1', [
'as' => 'outbox', 'as' => 'outbox',

View File

@ -326,8 +326,7 @@ class ActorController extends Controller
public function attemptFollow(): RedirectResponse public function attemptFollow(): RedirectResponse
{ {
$rules = [ $rules = [
'handle' => 'handle' => 'regex_match[/^@?(?P<username>[\w\.\-]+)@(?P<host>[\w\.\-]+)(?P<port>:[\d]+)?$/]',
'regex_match[/^@?(?P<username>[\w\.\-]+)@(?P<host>[\w\.\-]+)(?P<port>:[\d]+)?$/]',
]; ];
if (! $this->validate($rules)) { if (! $this->validate($rules)) {

View File

@ -214,8 +214,7 @@ class PostController extends Controller
public function attemptRemoteAction(string $action): RedirectResponse | ResponseInterface public function attemptRemoteAction(string $action): RedirectResponse | ResponseInterface
{ {
$rules = [ $rules = [
'handle' => 'handle' => 'regex_match[/^@?(?P<username>[\w\.\-]+)@(?P<host>[\w\.\-]+)(?P<port>:[\d]+)?$/]',
'regex_match[/^@?(?P<username>[\w\.\-]+)@(?P<host>[\w\.\-]+)(?P<port>:[\d]+)?$/]',
]; ];
if (! $this->validate($rules)) { if (! $this->validate($rules)) {

View File

@ -107,7 +107,10 @@ class ActivityModel extends BaseUuidModel
'actor_id' => $actorId, 'actor_id' => $actorId,
'target_actor_id' => $targetActorId, 'target_actor_id' => $targetActorId,
'post_id' => $postId, 'post_id' => $postId,
'type' => $type === 'Undo' ? $type . '_' . (json_decode($payload, true))['object']['type'] : $type, 'type' => $type === 'Undo' ? $type . '_' . (json_decode(
$payload,
true
))['object']['type'] : $type,
'payload' => $payload, 'payload' => $payload,
'scheduled_at' => $scheduledAt, 'scheduled_at' => $scheduledAt,
'status' => $taskStatus, 'status' => $taskStatus,

View File

@ -167,8 +167,7 @@ class InstallController extends Controller
$mediaBaseUrl = $this->request->getPost('media_base_url'); $mediaBaseUrl = $this->request->getPost('media_base_url');
self::writeEnv([ self::writeEnv([
'app.baseURL' => $baseUrl, 'app.baseURL' => $baseUrl,
'media.baseURL' => 'media.baseURL' => $mediaBaseUrl === '' ? $baseUrl : $mediaBaseUrl,
$mediaBaseUrl === '' ? $baseUrl : $mediaBaseUrl,
'analytics.salt' => generate_random_salt(64), 'analytics.salt' => generate_random_salt(64),
'admin.gateway' => $this->request->getPost('admin_gateway'), 'admin.gateway' => $this->request->getPost('admin_gateway'),
'auth.gateway' => $this->request->getPost('auth_gateway'), 'auth.gateway' => $this->request->getPost('auth_gateway'),

View File

@ -19,8 +19,7 @@ $routes->group(
$routes->group('podcasts/(:num)/subscriptions', static function ($routes): void { $routes->group('podcasts/(:num)/subscriptions', static function ($routes): void {
$routes->get('/', 'SubscriptionController::list/$1', [ $routes->get('/', 'SubscriptionController::list/$1', [
'as' => 'subscription-list', 'as' => 'subscription-list',
'filter' => 'filter' => 'permission:podcast#.manage-subscriptions',
'permission:podcast#.manage-subscriptions',
]); ]);
$routes->get('add', 'SubscriptionController::add/$1', [ $routes->get('add', 'SubscriptionController::add/$1', [
'as' => 'subscription-add', 'as' => 'subscription-add',
@ -30,8 +29,7 @@ $routes->group(
'add', 'add',
'SubscriptionController::attemptAdd/$1', 'SubscriptionController::attemptAdd/$1',
[ [
'filter' => 'filter' => 'permission:podcast#.manage-subscriptions',
'permission:podcast#.manage-subscriptions',
], ],
); );
$routes->post('save-link', 'SubscriptionController::attemptLinkSave/$1', [ $routes->post('save-link', 'SubscriptionController::attemptLinkSave/$1', [
@ -42,16 +40,14 @@ $routes->group(
$routes->group('(:num)', static function ($routes): void { $routes->group('(:num)', static function ($routes): void {
$routes->get('/', 'SubscriptionController::view/$1/$2', [ $routes->get('/', 'SubscriptionController::view/$1/$2', [
'as' => 'subscription-view', 'as' => 'subscription-view',
'filter' => 'filter' => 'permission:podcast#.manage-subscriptions',
'permission:podcast#.manage-subscriptions',
]); ]);
$routes->get( $routes->get(
'edit', 'edit',
'SubscriptionController::edit/$1/$2', 'SubscriptionController::edit/$1/$2',
[ [
'as' => 'subscription-edit', 'as' => 'subscription-edit',
'filter' => 'filter' => 'permission:podcast#.manage-subscriptions',
'permission:podcast#.manage-subscriptions',
], ],
); );
$routes->post( $routes->post(
@ -59,8 +55,7 @@ $routes->group(
'SubscriptionController::attemptEdit/$1/$2', 'SubscriptionController::attemptEdit/$1/$2',
[ [
'as' => 'subscription-edit', 'as' => 'subscription-edit',
'filter' => 'filter' => 'permission:podcast#.manage-subscriptions',
'permission:podcast#.manage-subscriptions',
], ],
); );
$routes->get( $routes->get(
@ -68,8 +63,7 @@ $routes->group(
'SubscriptionController::regenerateToken/$1/$2', 'SubscriptionController::regenerateToken/$1/$2',
[ [
'as' => 'subscription-regenerate-token', 'as' => 'subscription-regenerate-token',
'filter' => 'filter' => 'permission:podcast#.manage-subscriptions',
'permission:podcast#.manage-subscriptions',
] ]
); );
$routes->get( $routes->get(
@ -77,16 +71,14 @@ $routes->group(
'SubscriptionController::suspend/$1/$2', 'SubscriptionController::suspend/$1/$2',
[ [
'as' => 'subscription-suspend', 'as' => 'subscription-suspend',
'filter' => 'filter' => 'permission:podcast#.manage-subscriptions',
'permission:podcast#.manage-subscriptions',
], ],
); );
$routes->post( $routes->post(
'suspend', 'suspend',
'SubscriptionController::attemptSuspend/$1/$2', 'SubscriptionController::attemptSuspend/$1/$2',
[ [
'filter' => 'filter' => 'permission:podcast#.manage-subscriptions',
'permission:podcast#.manage-subscriptions',
], ],
); );
$routes->get( $routes->get(
@ -94,8 +86,7 @@ $routes->group(
'SubscriptionController::resume/$1/$2', 'SubscriptionController::resume/$1/$2',
[ [
'as' => 'subscription-resume', 'as' => 'subscription-resume',
'filter' => 'filter' => 'permission:podcast#.manage-subscriptions',
'permission:podcast#.manage-subscriptions',
], ],
); );
$routes->get( $routes->get(
@ -103,16 +94,14 @@ $routes->group(
'SubscriptionController::delete/$1/$2', 'SubscriptionController::delete/$1/$2',
[ [
'as' => 'subscription-delete', 'as' => 'subscription-delete',
'filter' => 'filter' => 'permission:podcast#.manage-subscriptions',
'permission:podcast#.manage-subscriptions',
], ],
); );
$routes->post( $routes->post(
'delete', 'delete',
'SubscriptionController::attemptDelete/$1/$2', 'SubscriptionController::attemptDelete/$1/$2',
[ [
'filter' => 'filter' => 'permission:podcast#.manage-subscriptions',
'permission:podcast#.manage-subscriptions',
], ],
); );
}); });

View File

@ -17,8 +17,8 @@
"build:svg": "svgo -f app/Resources/images -o public/assets/images -r --config=./.svgo.js", "build:svg": "svgo -f app/Resources/images -o public/assets/images -r --config=./.svgo.js",
"lint": "eslint --ext js,ts app/Resources", "lint": "eslint --ext js,ts app/Resources",
"lint:fix": "eslint --ext js,ts app/Resources --fix", "lint:fix": "eslint --ext js,ts app/Resources --fix",
"lint:css": "stylelint \"app/Resources/**/*.css\"", "lint:css": "stylelint -f verbose \"app/Resources/**/*.css\"",
"lint:css:fix": "stylelint --fix \"app/Resources/**/*.css\"", "lint:css:fix": "stylelint -f verbose --fix \"app/Resources/**/*.css\"",
"prettier": "prettier --check --ignore-path .gitignore .", "prettier": "prettier --check --ignore-path .gitignore .",
"prettier:fix": "prettier --write --ignore-path .gitignore .", "prettier:fix": "prettier --write --ignore-path .gitignore .",
"typecheck": "tsc", "typecheck": "tsc",

View File

@ -5,7 +5,6 @@ declare(strict_types=1);
use Rector\CodeQuality\Rector\PropertyFetch\ExplicitMethodCallOverMagicGetSetRector; use Rector\CodeQuality\Rector\PropertyFetch\ExplicitMethodCallOverMagicGetSetRector;
use Rector\CodingStyle\Rector\ClassMethod\UnSpreadOperatorRector; use Rector\CodingStyle\Rector\ClassMethod\UnSpreadOperatorRector;
use Rector\CodingStyle\Rector\Encapsed\EncapsedStringsToSprintfRector; use Rector\CodingStyle\Rector\Encapsed\EncapsedStringsToSprintfRector;
use Rector\CodingStyle\Rector\FuncCall\ConsistentPregDelimiterRector;
use Rector\CodingStyle\Rector\Stmt\NewlineAfterStatementRector; use Rector\CodingStyle\Rector\Stmt\NewlineAfterStatementRector;
use Rector\CodingStyle\Rector\String_\SymplifyQuoteEscapeRector; use Rector\CodingStyle\Rector\String_\SymplifyQuoteEscapeRector;
use Rector\Config\RectorConfig; use Rector\Config\RectorConfig;
@ -76,8 +75,4 @@ return static function (RectorConfig $rectorConfig): void {
// Path to phpstan with extensions, that PHPStan in Rector uses to determine types // Path to phpstan with extensions, that PHPStan in Rector uses to determine types
$rectorConfig->phpstanConfig(__DIR__ . '/phpstan.neon'); $rectorConfig->phpstanConfig(__DIR__ . '/phpstan.neon');
$rectorConfig->ruleWithConfiguration(ConsistentPregDelimiterRector::class, [
ConsistentPregDelimiterRector::DELIMITER => '~',
]);
}; };

View File

@ -15,8 +15,7 @@ $isEpisodeArea = isset($podcast) && isset($episode);
<?php endif; ?> <?php endif; ?>
<footer class="px-2 py-2 mx-auto text-xs text-right"> <footer class="px-2 py-2 mx-auto text-xs text-right">
<?= lang('Common.powered_by', [ <?= lang('Common.powered_by', [
'castopod' => 'castopod' => '<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a> ' .
'<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a> ' .
CP_VERSION, CP_VERSION,
], null, false) ?> ], null, false) ?>
</footer> </footer>

View File

@ -187,8 +187,7 @@
), ),
icon('delete-bin', 'mx-auto'), icon('delete-bin', 'mx-auto'),
[ [
'class' => 'class' => 'p-1 text-sm bg-red-100 rounded-full text-red-700 hover:text-red-900 focus:ring-accent',
'p-1 text-sm bg-red-100 rounded-full text-red-700 hover:text-red-900 focus:ring-accent',
'data-tooltip' => 'bottom', 'data-tooltip' => 'bottom',
'title' => lang( 'title' => lang(
'Episode.form.transcript_file_delete', 'Episode.form.transcript_file_delete',
@ -242,8 +241,7 @@
), ),
icon('delete-bin', 'mx-auto'), icon('delete-bin', 'mx-auto'),
[ [
'class' => 'class' => 'text-sm p-1 bg-red-100 rounded-full text-red-700 hover:text-red-900 focus:ring-accent',
'text-sm p-1 bg-red-100 rounded-full text-red-700 hover:text-red-900 focus:ring-accent',
'data-tooltip' => 'bottom', 'data-tooltip' => 'bottom',
'title' => lang( 'title' => lang(
'Episode.form.chapters_file_delete', 'Episode.form.chapters_file_delete',

View File

@ -79,8 +79,7 @@
), ),
icon('delete-bin', 'mx-auto'), icon('delete-bin', 'mx-auto'),
[ [
'class' => 'class' => 'absolute right-0 p-1 bg-red-100 rounded-full text-red-700 hover:text-red-900',
'absolute right-0 p-1 bg-red-100 rounded-full text-red-700 hover:text-red-900',
'data-tooltip' => 'bottom', 'data-tooltip' => 'bottom',
'title' => lang('Platforms.remove', [ 'title' => lang('Platforms.remove', [
'platformName' => $platform->label, 'platformName' => $platform->label,

View File

@ -70,8 +70,7 @@
[ [
'width' => 420, 'width' => 420,
'height' => 620, 'height' => 620,
'class' => 'class' => 'group inline-flex items-center px-3 leading-8 text-xs tracking-wider font-semibold text-black uppercase rounded-full shadow focus:ring-accent bg-white',
'group inline-flex items-center px-3 leading-8 text-xs tracking-wider font-semibold text-black uppercase rounded-full shadow focus:ring-accent bg-white',
], ],
) ?> ) ?>
</div> </div>

View File

@ -104,8 +104,7 @@
<footer class="container flex justify-between px-2 py-4 mx-auto text-sm text-right border-t border-subtle"> <footer class="container flex justify-between px-2 py-4 mx-auto text-sm text-right border-t border-subtle">
<?= render_page_links() ?> <?= render_page_links() ?>
<small><?= lang('Common.powered_by', [ <small><?= lang('Common.powered_by', [
'castopod' => 'castopod' => '<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
'<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
], null, false) ?></small> ], null, false) ?></small>
</footer> </footer>
</body> </body>

View File

@ -53,8 +53,7 @@
<footer class="container flex justify-between px-2 py-4 mx-auto text-sm text-right border-t border-subtle"> <footer class="container flex justify-between px-2 py-4 mx-auto text-sm text-right border-t border-subtle">
<?= render_page_links() ?> <?= render_page_links() ?>
<small><?= lang('Common.powered_by', [ <small><?= lang('Common.powered_by', [
'castopod' => 'castopod' => '<a class="underline hover:no-underline focus:ring-accent" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod</a>',
'<a class="underline hover:no-underline focus:ring-accent" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod</a>',
], null, false) ?></small> ], null, false) ?></small>
</footer> </footer>
</body> </body>

View File

@ -56,8 +56,7 @@
<footer class="container flex justify-between px-2 py-4 mx-auto text-sm text-right"> <footer class="container flex justify-between px-2 py-4 mx-auto text-sm text-right">
<?= render_page_links() ?> <?= render_page_links() ?>
<small><?= lang('Common.powered_by', [ <small><?= lang('Common.powered_by', [
'castopod' => 'castopod' => '<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
'<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
], null, false) ?></small> ], null, false) ?></small>
</footer> </footer>
</body> </body>

View File

@ -69,8 +69,7 @@
[ [
'width' => 420, 'width' => 420,
'height' => 620, 'height' => 620,
'class' => 'class' => 'group inline-flex items-center px-4 text-xs tracking-wider font-semibold text-black uppercase rounded-full leading-8 shadow focus:ring-accent bg-white',
'group inline-flex items-center px-4 text-xs tracking-wider font-semibold text-black uppercase rounded-full leading-8 shadow focus:ring-accent bg-white',
], ],
) ?> ) ?>
</div> </div>

View File

@ -64,8 +64,7 @@
<div class="flex flex-col"> <div class="flex flex-col">
<p><?= esc($podcast->copyright) ?></p> <p><?= esc($podcast->copyright) ?></p>
<p><?= lang('Common.powered_by', [ <p><?= lang('Common.powered_by', [
'castopod' => 'castopod' => '<a class="inline-flex font-semibold text-skin-muted hover:underline focus:ring-accent" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
'<a class="inline-flex font-semibold text-skin-muted hover:underline focus:ring-accent" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
], null, false) ?></p> ], null, false) ?></p>
</div> </div>
</footer> </footer>

View File

@ -27,8 +27,7 @@
$link['route'], $link['route'],
$link['label'] . ' (' . $link['number_of_episodes'] . ')', $link['label'] . ' (' . $link['number_of_episodes'] . ')',
[ [
'class' => 'class' => 'px-2 py-1 whitespace-nowrap hover:bg-highlight ' .
'px-2 py-1 whitespace-nowrap hover:bg-highlight ' .
($link['is_active'] ($link['is_active']
? 'font-semibold' ? 'font-semibold'
: 'text-skin-muted hover:text-skin-base'), : 'text-skin-muted hover:text-skin-base'),

View File

@ -67,8 +67,7 @@
<footer <footer
class="flex-col w-full px-2 py-4 mt-auto text-xs text-center border-t text-skin-muted border-subtle"> class="flex-col w-full px-2 py-4 mt-auto text-xs text-center border-t text-skin-muted border-subtle">
<?= lang('Common.powered_by', [ <?= lang('Common.powered_by', [
'castopod' => 'castopod' => '<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
'<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
], null, false) ?> ], null, false) ?>
</footer> </footer>
</body> </body>

View File

@ -42,8 +42,7 @@ if ($post->in_reply_to_id): ?>
'actorUsername' => esc($post->actor->username), 'actorUsername' => esc($post->actor->username),
]), ]),
[ [
'class' => 'class' => 'text-center justify-center font-semibold rounded-full shadow relative z-10 px-4 py-2 w-full bg-accent-base text-accent-contrast inline-flex items-center hover:bg-accent-hover',
'text-center justify-center font-semibold rounded-full shadow relative z-10 px-4 py-2 w-full bg-accent-base text-accent-contrast inline-flex items-center hover:bg-accent-hover',
'width' => 420, 'width' => 420,
'height' => 620, 'height' => 620,
], ],

View File

@ -58,8 +58,7 @@
<footer <footer
class="flex-col w-full px-2 py-4 mt-auto text-xs text-center border-t text-skin-muted border-subtle"> class="flex-col w-full px-2 py-4 mt-auto text-xs text-center border-t text-skin-muted border-subtle">
<?= lang('Common.powered_by', [ <?= lang('Common.powered_by', [
'castopod' => 'castopod' => '<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
'<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
], null, false) ?> ], null, false) ?>
</footer> </footer>
</body> </body>

View File

@ -33,8 +33,7 @@
<footer class="flex flex-col text-sm"> <footer class="flex flex-col text-sm">
<?= $this->renderSection('footer') ?> <?= $this->renderSection('footer') ?>
<small class="py-4 text-center border-t border-subtle"><?= lang('Common.powered_by', [ <small class="py-4 text-center border-t border-subtle"><?= lang('Common.powered_by', [
'castopod' => 'castopod' => '<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
'<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
], null, false) ?></small> ], null, false) ?></small>
</footer> </footer>
</body> </body>

View File

@ -29,8 +29,7 @@
</main> </main>
<footer class="container px-2 py-4 mx-auto text-sm text-right border-t border-subtle"> <footer class="container px-2 py-4 mx-auto text-sm text-right border-t border-subtle">
<small><?= lang('Common.powered_by', [ <small><?= lang('Common.powered_by', [
'castopod' => 'castopod' => '<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
'<a class="inline-flex font-semibold hover:underline focus:ring-accent" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '</a>',
], null, false) ?></small> ], null, false) ?></small>
</footer> </footer>
</body> </body>