diff options
-rw-r--r-- | Zotlabs/Web/HttpMeta.php | 109 |
1 files changed, 73 insertions, 36 deletions
diff --git a/Zotlabs/Web/HttpMeta.php b/Zotlabs/Web/HttpMeta.php index ceaa82162..7cf93dda9 100644 --- a/Zotlabs/Web/HttpMeta.php +++ b/Zotlabs/Web/HttpMeta.php @@ -6,71 +6,108 @@ namespace Zotlabs\Web; class HttpMeta { private $vars = null; - private $og = null; + private $og = null; function __construct() { - $this->vars = array(); - $this->og = array(); + $this->vars = []; + $this->og = []; + $this->ogproperties = []; } - function set($property,$value) { - if(strpos($property,'og:') === 0) - $this->og[$property] = $value; - else + //Set Meta Value + // Mode: + // 0 = Default - set if no value currently exists + // 1 = Overwrite - replace existing value(s) + // 2 = Multi - append to the array of values + function set($property,$value,$mode=0) { + $ogallowsmulti = ['image','audio','video']; + if (strpos($property,'og:') === 0) { + $count = 0; + foreach ($this->og as $ogk => $ogdata) { + if (strpos($ogdata['property'],$property) === 0) { + if ($mode == 1) { + unset($this->og[$ogk]); + unset($this->ogproperties[$property]); + } + elseif ($mode == 0) { + return; + } + elseif ($value == $ogdata['value']) { + return; + } + else { + $count++; + } + } + } + + if ($value !== null) { + //mode = 1 with value === null will delete the property entirely. + $components = explode(':',$property); + $ogp=$components[1]; + + if (!$count || in_array($ogp,$ogallowsmulti)) { + $this->og[]=['property'=>$property,'value'=>$value]; + $this->ogproperties[$property] = $property; + } + } + } else { $this->vars[$property] = $value; + } } function check_required() { - if( - ($this->og) - && array_key_exists('og:title',$this->og) - && array_key_exists('og:type', $this->og) - && array_key_exists('og:image',$this->og) - && array_key_exists('og:url', $this->og) - ) + if ( + in_array('og:title',$this->ogproperties) + && in_array('og:type', $this->ogproperties) + && (in_array('og:image',$this->ogproperties) + || in_array('og:image:url',$this->ogproperties)) + && (array_key_exists('og:url', $this->ogproperties) + || array_key_exists('og:url:secure_url', $this->ogproperties)) + && array_key_exists('og:description', $this->ogproperties) + ) { return true; + } return false; } function get_field($field) { - if(strpos($field,'og:') === 0) - $arr = $this->og; - else + if (strpos($field,'og:') === 0) { + foreach ($this->og as $ogdata) { + if (strpos($ogdata['property'],$field) === 0) { + $arr[$field][] = $ogdata['value']; + } + } + } + else { $arr = $this->vars; + } - if($arr && array_key_exists($field,$arr) && $arr[$field]) + if (isset($arr) && is_array($arr) && array_key_exists($field,$arr) && $arr[$field]) { return $arr[$field]; + } return false; } function get() { + // use 'name' for most meta fields, and 'property' for opengraph properties $o = ''; - if($this->vars) { - foreach($this->vars as $k => $v) { - $o .= '<meta property="' . $k . '" content="' . urlencode($v) . '" />' . "\r\n" ; + if ($this->vars) { + foreach ($this->vars as $k => $v) { + $o .= '<meta name="' . htmlspecialchars($k,ENT_COMPAT,'UTF-8',false) . '" content="' . htmlspecialchars($v,ENT_COMPAT,'UTF-8',false) . '" />' . "\r\n" ; } } - if($this->check_required()) { - $arrayproperties = [ 'og:image' ]; - foreach($this->og as $k => $v) { - if (in_array($k,$arrayproperties)) { - if (is_array($v)) { - foreach ($v as $v2) { - $o .= '<meta property="' . $k . '" content="' . $v2 . '" />' . "\r\n" ; - } - } else { - $o .= '<meta property="' . $k . '" content="' . $v . '" />' . "\r\n" ; - } - } else { - $o .= '<meta property="' . $k . '" content="' . $v . '" />' . "\r\n" ; - } + if ($this->check_required()) { + foreach ($this->og as $ogdata) { + $o .= '<meta property="' . htmlspecialchars($ogdata['property'],ENT_COMPAT,'UTF-8',false) . '" content="' . htmlspecialchars($ogdata['value'],ENT_COMPAT,'UTF-8',false) . '" />' . "\r\n" ; } } - if($o) + if ($o) { return "\r\n" . $o; + } return $o; } |