Bivio::UI::XHTML::Widget::OpenGraphHead
# Copyright (c) 2018 Bivio Software, Inc. All Rights Reserved.
# $Id$
package Bivio::UI::XHTML::Widget::OpenGraphHead;
use strict;
use Bivio::Base 'XHTMLWidget.ControlBase';
b_use('UI.ViewLanguageAUTOLOAD');
our($VERSION) = sprintf('%d.%02d', q$Revision: 0.0$ =~ /\d+/g);
my($_REQ_KEY) = b_use('XHTMLWidget.OpenGraphProperty')->REQ_KEY;
my($_HS) = b_use('HTML.Scraper');
my($_S) = b_use('Type.String');
sub control_on_render {
my($self, $source, $buffer) = @_;
my($p) = $source->ureq($_REQ_KEY) || {};
Join([
META({
PROPERTY => 'og:type',
CONTENT => 'website',
}),
META({
PROPERTY => 'og:site_name',
CONTENT => vs_text('site_name'),
}),
META({
PROPERTY => 'og:url',
CONTENT => vs_canonical_uri_for_this_page(),
}),
map(
META({
PROPERTY => "og:$_",
# Sometimes HTML, but we're excerpting.
CONTENT => ${_excerpt($p->{$_})},
}),
sort(keys(%$p)),
),
])->initialize_and_render($source, $buffer);
return;
}
sub initialize {
my($self) = @_;
$self->put(
# only matters for anonymous users (robots)
control => And(
['!', '->ureq', 'auth_user'],
vs_task_has_uri(['->req', 'task_id']),
),
);
return shift->SUPER::initialize(@_);
}
sub _excerpt {
my($v) = @_;
# partial html needs to be encapsulated
$v = "<html><body>$v</body></html>"
unless $v =~ /<\s*html/i;
return $_S->canonicalize_and_excerpt($_HS->to_text(\$v));
}
1;