1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap\Meta\Api; 4*04fd306cSNickeau 5*04fd306cSNickeauuse ComboStrap\CacheExpirationDate; 6*04fd306cSNickeauuse ComboStrap\CacheExpirationFrequency; 7*04fd306cSNickeauuse ComboStrap\Canonical; 8*04fd306cSNickeauuse ComboStrap\DisqusIdentifier; 9*04fd306cSNickeauuse ComboStrap\DokuwikiId; 10*04fd306cSNickeauuse ComboStrap\EndDate; 11*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument; 12*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 13*04fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal; 14*04fd306cSNickeauuse ComboStrap\ExecutionContext; 15*04fd306cSNickeauuse ComboStrap\FeaturedIcon; 16*04fd306cSNickeauuse ComboStrap\FirstImage; 17*04fd306cSNickeauuse ComboStrap\FirstRasterImage; 18*04fd306cSNickeauuse ComboStrap\FirstSvgIllustration; 19*04fd306cSNickeauuse ComboStrap\Label; 20*04fd306cSNickeauuse ComboStrap\Lang; 21*04fd306cSNickeauuse ComboStrap\LdJson; 22*04fd306cSNickeauuse ComboStrap\Lead; 23*04fd306cSNickeauuse ComboStrap\Locale; 24*04fd306cSNickeauuse ComboStrap\LogUtility; 25*04fd306cSNickeauuse ComboStrap\LowQualityCalculatedIndicator; 26*04fd306cSNickeauuse ComboStrap\LowQualityPageOverwrite; 27*04fd306cSNickeauuse ComboStrap\Meta\Field\Aliases; 28*04fd306cSNickeauuse ComboStrap\Meta\Field\AliasPath; 29*04fd306cSNickeauuse ComboStrap\Meta\Field\AliasType; 30*04fd306cSNickeauuse ComboStrap\Meta\Field\AncestorImage; 31*04fd306cSNickeauuse ComboStrap\Meta\Field\FacebookImage; 32*04fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedImage; 33*04fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedRasterImage; 34*04fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedSvgImage; 35*04fd306cSNickeauuse ComboStrap\Meta\Field\PageH1; 36*04fd306cSNickeauuse ComboStrap\Meta\Field\PageImage; 37*04fd306cSNickeauuse ComboStrap\Meta\Field\PageImagePath; 38*04fd306cSNickeauuse ComboStrap\Meta\Field\PageImages; 39*04fd306cSNickeauuse ComboStrap\Meta\Field\PageTemplateName; 40*04fd306cSNickeauuse ComboStrap\Meta\Field\Region; 41*04fd306cSNickeauuse ComboStrap\Meta\Field\SocialCardImage; 42*04fd306cSNickeauuse ComboStrap\Meta\Field\TwitterImage; 43*04fd306cSNickeauuse ComboStrap\ModificationDate; 44*04fd306cSNickeauuse ComboStrap\CreationDate; 45*04fd306cSNickeauuse ComboStrap\PageDescription; 46*04fd306cSNickeauuse ComboStrap\PageId; 47*04fd306cSNickeauuse ComboStrap\PageImageUsage; 48*04fd306cSNickeauuse ComboStrap\PageKeywords; 49*04fd306cSNickeauuse ComboStrap\PageLevel; 50*04fd306cSNickeauuse ComboStrap\PagePath; 51*04fd306cSNickeauuse ComboStrap\PagePublicationDate; 52*04fd306cSNickeauuse ComboStrap\PageTitle; 53*04fd306cSNickeauuse ComboStrap\PageType; 54*04fd306cSNickeauuse ComboStrap\PageUrlPath; 55*04fd306cSNickeauuse ComboStrap\PluginUtility; 56*04fd306cSNickeauuse ComboStrap\QualityDynamicMonitoringOverwrite; 57*04fd306cSNickeauuse ComboStrap\References; 58*04fd306cSNickeauuse ComboStrap\ReplicationDate; 59*04fd306cSNickeauuse ComboStrap\ResourceName; 60*04fd306cSNickeauuse ComboStrap\Slug; 61*04fd306cSNickeauuse ComboStrap\StartDate; 62*04fd306cSNickeau 63*04fd306cSNickeauclass MetadataSystem 64*04fd306cSNickeau{ 65*04fd306cSNickeau 66*04fd306cSNickeau /** 67*04fd306cSNickeau * All known metadatas 68*04fd306cSNickeau */ 69*04fd306cSNickeau public const METADATAS = [ 70*04fd306cSNickeau Aliases::PROPERTY_NAME => Aliases::class, 71*04fd306cSNickeau Canonical::PROPERTY_NAME => Canonical::class, 72*04fd306cSNickeau EndDate::PROPERTY_NAME => EndDate::class, 73*04fd306cSNickeau PageType::PROPERTY_NAME => PageType::class, 74*04fd306cSNickeau PageH1::PROPERTY_NAME => PageH1::class, 75*04fd306cSNickeau PageUrlPath::PROPERTY_NAME => PageUrlPath::class, 76*04fd306cSNickeau Lang::PROPERTY_NAME => Lang::class, 77*04fd306cSNickeau LdJson::PROPERTY_NAME => LdJson::class, 78*04fd306cSNickeau LdJson::OLD_ORGANIZATION_PROPERTY => LdJson::class, 79*04fd306cSNickeau PageTitle::PROPERTY_NAME => PageTitle::class, 80*04fd306cSNickeau PagePublicationDate::PROPERTY_NAME => PagePublicationDate::class, 81*04fd306cSNickeau PagePublicationDate::OLD_META_KEY => PagePublicationDate::class, 82*04fd306cSNickeau Region::PROPERTY_NAME => Region::class, 83*04fd306cSNickeau ResourceName::PROPERTY_NAME => ResourceName::class, 84*04fd306cSNickeau StartDate::PROPERTY_NAME => StartDate::class, 85*04fd306cSNickeau PageDescription::PROPERTY_NAME => PageDescription::class, 86*04fd306cSNickeau DisqusIdentifier::PROPERTY_NAME => DisqusIdentifier::class, 87*04fd306cSNickeau Slug::PROPERTY_NAME => Slug::class, 88*04fd306cSNickeau PageKeywords::PROPERTY_NAME => PageKeywords::class, 89*04fd306cSNickeau CacheExpirationFrequency::PROPERTY_NAME => CacheExpirationFrequency::class, 90*04fd306cSNickeau QualityDynamicMonitoringOverwrite::PROPERTY_NAME => QualityDynamicMonitoringOverwrite::class, 91*04fd306cSNickeau LowQualityPageOverwrite::PROPERTY_NAME => LowQualityPageOverwrite::class, 92*04fd306cSNickeau Locale::PROPERTY_NAME=>Locale::class, 93*04fd306cSNickeau CacheExpirationDate::PROPERTY_NAME=>CacheExpirationDate::class, 94*04fd306cSNickeau FeaturedImage::PROPERTY_NAME => FeaturedImage::class, 95*04fd306cSNickeau FeaturedSvgImage::PROPERTY_NAME => FeaturedSvgImage::class, 96*04fd306cSNickeau FeaturedRasterImage::PROPERTY_NAME => FeaturedRasterImage::class, 97*04fd306cSNickeau FeaturedIcon::PROPERTY_NAME => FeaturedIcon::class, 98*04fd306cSNickeau Lead::PROPERTY_NAME => Lead::class, 99*04fd306cSNickeau Label::PROPERTY_NAME => Label::class, 100*04fd306cSNickeau TwitterImage::PROPERTY_NAME => TwitterImage::class, 101*04fd306cSNickeau FacebookImage::PROPERTY_NAME => FacebookImage::class, 102*04fd306cSNickeau AliasPath::PROPERTY_NAME => Aliases::class, 103*04fd306cSNickeau AliasType::PROPERTY_NAME => Aliases::class, 104*04fd306cSNickeau PageImages::PROPERTY_NAME => PageImages::class, 105*04fd306cSNickeau PageImages::OLD_PROPERTY_NAME => PageImages::class, 106*04fd306cSNickeau PageImagePath::PROPERTY_NAME => PageImages::class, 107*04fd306cSNickeau PageImageUsage::PROPERTY_NAME => PageImages::class, 108*04fd306cSNickeau SocialCardImage::PROPERTY_NAME => SocialCardImage::class, 109*04fd306cSNickeau AncestorImage::PROPERTY_NAME => AncestorImage::class, 110*04fd306cSNickeau FirstImage::PROPERTY_NAME => FirstImage::class, 111*04fd306cSNickeau Region::OLD_REGION_PROPERTY => Region::class, 112*04fd306cSNickeau PageTemplateName::PROPERTY_NAME => PageTemplateName::class, 113*04fd306cSNickeau PageTemplateName::PROPERTY_NAME_OLD => PageTemplateName::class, 114*04fd306cSNickeau DokuwikiId::DOKUWIKI_ID_ATTRIBUTE => DokuwikiId::class, 115*04fd306cSNickeau ReplicationDate::PROPERTY_NAME => ReplicationDate::class, 116*04fd306cSNickeau References::PROPERTY_NAME => References::class, 117*04fd306cSNickeau LowQualityCalculatedIndicator::PROPERTY_NAME => LowQualityCalculatedIndicator::class, 118*04fd306cSNickeau PagePath::PROPERTY_NAME => PagePath::class, 119*04fd306cSNickeau CreationDate::PROPERTY_NAME => CreationDate::class, 120*04fd306cSNickeau ModificationDate::PROPERTY_NAME => ModificationDate::class, 121*04fd306cSNickeau PageLevel::PROPERTY_NAME => PageLevel::class, 122*04fd306cSNickeau PageId::PROPERTY_NAME => PageId::class 123*04fd306cSNickeau ]; 124*04fd306cSNickeau 125*04fd306cSNickeau 126*04fd306cSNickeau /** 127*04fd306cSNickeau * @return Metadata[] 128*04fd306cSNickeau */ 129*04fd306cSNickeau public static function getMetadataObjects(): array 130*04fd306cSNickeau { 131*04fd306cSNickeau /** 132*04fd306cSNickeau * TODO: create a metadata metadata object and a metadata processing object 133*04fd306cSNickeau * We can't cache as we mix for now, in the same object 134*04fd306cSNickeau * * the metadata metadata (ie {@link Metadata::isOnForm()}, ... 135*04fd306cSNickeau * * and the process object {@link Metadata::setReadStore()}, writestore, value 136*04fd306cSNickeau */ 137*04fd306cSNickeau $metadatas = []; 138*04fd306cSNickeau foreach (self::METADATAS as $metadataClass) { 139*04fd306cSNickeau $metadatas[] = new $metadataClass(); 140*04fd306cSNickeau } 141*04fd306cSNickeau return $metadatas; 142*04fd306cSNickeau 143*04fd306cSNickeau } 144*04fd306cSNickeau 145*04fd306cSNickeau /** 146*04fd306cSNickeau * @return Metadata[] 147*04fd306cSNickeau */ 148*04fd306cSNickeau public static function getMetadataClasses(): array 149*04fd306cSNickeau { 150*04fd306cSNickeau return self::METADATAS; 151*04fd306cSNickeau } 152*04fd306cSNickeau 153*04fd306cSNickeau /** 154*04fd306cSNickeau * @param object|string $class 155*04fd306cSNickeau * @param Metadata|null $parent 156*04fd306cSNickeau * @return Metadata 157*04fd306cSNickeau * @throws ExceptionBadArgument - if the class is not a metadata class 158*04fd306cSNickeau */ 159*04fd306cSNickeau public static function toMetadataObject($class, Metadata $parent = null): Metadata 160*04fd306cSNickeau { 161*04fd306cSNickeau if (!is_subclass_of($class, Metadata::class)) { 162*04fd306cSNickeau throw new ExceptionBadArgument("The class ($class) is not a metadata class"); 163*04fd306cSNickeau } 164*04fd306cSNickeau return new $class($parent); 165*04fd306cSNickeau } 166*04fd306cSNickeau 167*04fd306cSNickeau /** 168*04fd306cSNickeau * @return Metadata[] 169*04fd306cSNickeau */ 170*04fd306cSNickeau public static function getMutableMetadata(): array 171*04fd306cSNickeau { 172*04fd306cSNickeau $metas = []; 173*04fd306cSNickeau foreach (MetadataSystem::getMetadataObjects() as $metadata) { 174*04fd306cSNickeau if ($metadata::isMutable()) { 175*04fd306cSNickeau $metas[] = $metadata; 176*04fd306cSNickeau } 177*04fd306cSNickeau } 178*04fd306cSNickeau return $metas; 179*04fd306cSNickeau } 180*04fd306cSNickeau 181*04fd306cSNickeau 182*04fd306cSNickeau /** 183*04fd306cSNickeau * @throws ExceptionNotFound 184*04fd306cSNickeau */ 185*04fd306cSNickeau public static function getForName(string $name): Metadata 186*04fd306cSNickeau { 187*04fd306cSNickeau 188*04fd306cSNickeau $name = strtolower(trim($name)); 189*04fd306cSNickeau $metadataClass = self::METADATAS[$name]; 190*04fd306cSNickeau if ($metadataClass !== null) { 191*04fd306cSNickeau return new $metadataClass(); 192*04fd306cSNickeau } 193*04fd306cSNickeau throw new ExceptionNotFound("No metadata found with the name ($name)"); 194*04fd306cSNickeau 195*04fd306cSNickeau } 196*04fd306cSNickeau} 197