+#!/usr/bin/perl
+
+package IkiWiki::Plugin::opengraph2;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+our $VERSION = '0.2.0';
+
+sub import {
+ hook(type => "preprocess", id => "opengraph2", call => \&preprocess);
+ hook(type => "pagetemplate", id => "opengraph2", call => \&opengraph_tags);
+}
+
+sub scrub ($$$) {
+ if (IkiWiki::Plugin::htmlscrubber->can("sanitize")) {
+ return IkiWiki::Plugin::htmlscrubber::sanitize(
+ content => shift, page => shift, destpage => shift);
+ }
+ else {
+ return shift;
+ }
+}
+
+sub preprocess (@) {
+ return "" unless @_;
+ my %params=@_;
+ my $key=shift;
+ my $value=$params{$key};
+ delete $params{$key};
+ my $page=$params{page};
+ delete $params{page};
+ my $destpage=$params{destpage};
+ delete $params{destpage};
+ delete $params{preview};
+
+ eval q{use HTML::Entities};
+ $value=decode_entities($value);
+
+ if ($key eq 'ogtitle') {
+ $pagestate{$page}{opengraph2}{ogtitle}=$value;
+ } elsif ($key eq 'ogimage') {
+ $pagestate{$page}{opengraph2}{ogimage}=urlto($value, 'index', '1');
+ } elsif ($key eq 'ogdesc') {
+ $pagestate{$page}{opengraph2}{ogdesc}=$value;
+ } elsif ($key eq 'ogtype') {
+ $pagestate{$page}{opengraph2}{ogtype}=$value;
+ }
+ return "";
+}
+
+sub opengraph_tags (@) {
+ my %params=@_;
+ my $page=$params{page};
+ my $destpage=$params{destpage};
+ my $template=$params{template};
+
+ my ${opengraph_title} = $pagestate{$page}{opengraph2}{ogtitle} || pagetitle(${params}{destpage}) || ${config}{'opengraph_title'};
+ my ${opengraph_description} = $pagestate{$page}{opengraph2}{ogdesc} || ${config}{'opengraph_description'};
+ my ${opengraph_type} = $pagestate{$page}{opengraph2}{ogtype} || ${config}{'opengraph_type'};
+ my ${opengraph_image} = $pagestate{$page}{opengraph2}{ogimage} || ${config}{'opengraph_image'};
+ my ${opengraph_url} = urlto(${params}{destpage}, 'index', '1') || ${config}{'opengraph_url'};
+
+ my ${opengraph_tag_title} = '<meta property="og:title" content="'.${opengraph_title}.'" />';
+ my ${opengraph_tag_description} = '<meta property="og:description" content="'.${opengraph_description}.'" />';
+ my ${opengraph_tag_type} = '<meta property="og:type" content="'.${opengraph_type}.'" />';
+ my ${opengraph_tag_image} = '<meta property="og:image" content="'.${opengraph_image}.'" />';
+ my ${opengraph_tag_url} = '<meta property="og:url" content="'.${opengraph_url}.'" />';
+
+ if (exists $pagestate{$page}{opengraph2} && $template->query(name => "meta")) {
+ my %seen;
+ $template->param(meta => join("\n",grep { (! $seen{$_}) && ($seen{$_}=1) } ${opengraph_tag_title},
+ ,"\n",${opengraph_tag_description},
+ ,"\n",${opengraph_tag_type},
+ ,"\n",${opengraph_tag_image},
+ ,"\n",${opengraph_tag_url}));
+ }
+
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IkiWiki::Plugin::opengraph2 - Adds Open Graph tags on the html head
+
+=head1 DESCRIPTION
+
+This plugin implements the Open Graph tags in the head of the hmtl for pages that have an opengraph2 directive. For more information on what is Open Graph, visit
+<https://en.wikipedia.org/wiki/Open_Graph>. To test your site against the
+Open Graph rules, use the tool available on
+<https://developers.facebook.com/tools/debug/og/object/>.
+
+=head1 INSTALLATION
+
+Put F<opengraph2.pm> in F<$HOME/.ikiwiki/IkiWiki/Plugin/> or elsewhere in
+your C<@INC> path. Or read <http://ikiwiki.info/plugins/install/>.
+
+=head1 CONFIGURATION
+
+Add to the configuration in your F<blog.setup> file.
+
+ ## opengraph2 plugin
+ # For more information, see
+ # <https://en.wikipedia.org/wiki/Open_Graph#Open_Graph_protocol>.
+ # Default values for <http://ikiwiki.info>
+ # obtained from <https://developers.facebook.com/tools/debug/og/object/>
+ # meta property="og:title"
+ opengraph_title: "ikiwiki"
+ # meta property="og:type"
+ opengraph_type: "website"
+ # meta property="og:url"
+ opengraph_url: "http://ikiwiki.info/"
+ # meta property="og:image"
+ opengraph_image: "http://ikiwiki.info/logo/ikiwiki.png"
+ # meta property="og:description"
+ opengraph_description: "Ikiwiki is a wiki compiler."
+
+Add C<meta> and C<opengraph2> to the list of plugins:
+
+ add_plugins => [qw{goodstuff opengraph2}],
+
+Use opengraph2 directives ogdesc, ogtype, ogtitle or ogimage to set a page as needing Open Graph headers. Values from the config will be used for any omitted directives.
+
+=head1 TEMPLATES
+
+Meta tags will show where the meta plugin has been configured to place them.
+
+=head1 BUGS AND LIMITATIONS
+
+=head1 LICENSE AND COPYRIGHT
+
+Copyleft (.) 2022 Frederik Vanrenterghem
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item https://ikiwiki.info/plugins/contrib/opengraph/
+
+=item https://en.wikipedia.org/wiki/Open_Graph
+
+=back