summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/OpenGraphMeta/OpenGraphMeta.class.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/OpenGraphMeta/OpenGraphMeta.class.php')
-rw-r--r--www/wiki/extensions/OpenGraphMeta/OpenGraphMeta.class.php150
1 files changed, 150 insertions, 0 deletions
diff --git a/www/wiki/extensions/OpenGraphMeta/OpenGraphMeta.class.php b/www/wiki/extensions/OpenGraphMeta/OpenGraphMeta.class.php
new file mode 100644
index 00000000..d015718f
--- /dev/null
+++ b/www/wiki/extensions/OpenGraphMeta/OpenGraphMeta.class.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * OpenGraphMeta
+ *
+ * @file
+ * @ingroup Extensions
+ * @author Daniel Friesen (http://danf.ca/mw/)
+ * @author Southparkfan
+ * @license GPL-2.0-or-later
+ * @link https://www.mediawiki.org/wiki/Extension:OpenGraphMeta Documentation
+ */
+
+class OpenGraphMeta {
+ /**
+ * @param Parser $parser
+ */
+ public static function onParserFirstCallInit( Parser $parser ) {
+ $parser->setFunctionHook( 'setmainimage', [ __CLASS__, 'setMainImagePF' ] );
+ $parser->setFunctionHook( 'setmaintitle', [ __CLASS__, 'setMainTitlePF' ] );
+ }
+
+ /**
+ * @param Parser $parser
+ * @param string $mainImage
+ * @return string
+ */
+ public static function setMainImagePF( Parser $parser, $mainImage ) {
+ $parserOutput = $parser->getOutput();
+ $setMainImage = $parserOutput->getExtensionData( 'setmainimage' );
+ if ( $setMainImage !== null ) {
+ return $mainImage;
+ }
+
+ if ( $mainImage !== '' ) {
+ $file = Title::newFromText( $mainImage, NS_FILE );
+ $parserOutput->setExtensionData( 'setmainimage', $file->getDBKey() );
+ return $mainImage;
+ }
+ }
+
+ /**
+ * @param Parser $parser
+ * @param string $mainTitle
+ * @return string
+ */
+ public static function setMainTitlePF( Parser $parser, $mainTitle ) {
+ $parserOutput = $parser->getOutput();
+ $setMainTitle = $parserOutput->getExtensionData( 'setmaintitle' );
+ if ( $setMainTitle !== null ) {
+ return $mainTitle;
+ }
+
+ $parserOutput->setExtensionData( 'setmaintitle', $mainTitle );
+
+ return $mainTitle;
+ }
+
+ /**
+ * @param OutputPage &$out
+ * @param ParserOutput $parserOutput
+ */
+ public static function onOutputPageParserOutput( OutputPage &$out, ParserOutput $parserOutput ) {
+ global $wgLogo, $wgSitename, $wgXhtmlNamespaces, $egFacebookAppId, $egFacebookAdmins, $bannerImage;
+ $setMainImage = $parserOutput->getExtensionData( 'setmainimage' );
+ $setMainTitle = $parserOutput->getExtensionData( 'setmaintitle' );
+
+ if ( $setMainImage !== null ) {
+ // $mainImage = wfFindFile( Title::newFromDBkey( $setMainImage ) );
+ if (filter_var($setMainImage, FILTER_VALIDATE_URL) === FALSE) {
+ $mainImage = wfFindFile(Title::newFromText( $setMainImage , NS_FILE ));
+ } else {
+ $mainImage = $setMainImage;
+ }
+ } else {
+ $mainImage = false;
+ }
+
+ $wgXhtmlNamespaces['og'] = 'http://opengraphprotocol.org/schema/';
+ $title = $out->getTitle();
+ $isMainpage = $title->isMainPage();
+
+ $meta = [];
+
+ if ( $isMainpage ) {
+ $meta['og:type'] = 'website';
+ $meta['og:title'] = $wgSitename;
+ } else {
+ $meta['og:type'] = 'article';
+ $meta['og:site_name'] = $wgSitename;
+ // Try to choose the most appropriate title for showing in news feeds.
+ if (
+ ( defined( 'NS_BLOG_ARTICLE' ) && $title->getNamespace() == NS_BLOG_ARTICLE ) ||
+ ( defined( 'NS_BLOG_ARTICLE_TALK' ) && $title->getNamespace() == NS_BLOG_ARTICLE_TALK )
+ ) {
+ $meta['og:title'] = $title->getSubpageText();
+ } else {
+ $meta['og:title'] = $title->getText();
+ }
+ }
+
+ // {{#setmaintitle}} was used, override og:title value
+ if ( $setMainTitle !== null ) {
+ $meta['og:title'] = $setMainTitle;
+ }
+
+ if ( ( $mainImage !== false ) ) {
+ if (filter_var($mainImage, FILTER_VALIDATE_URL) === FALSE) {
+ // The official OpenGraph documentation says:
+ // - thumbnail previews can't be smaller than 200px x 200px
+ // - thumbnail previews look best at 1200px x 630px
+ // @see https://developers.facebook.com/docs/sharing/best-practices/
+ // @see https://phabricator.wikimedia.org/T193986
+ $meta['og:image'] = wfExpandUrl( $mainImage->createThumb( 1200, 630 ) );
+ $bannerImage = wfExpandUrl( $mainImage->createThumb( 1200, 630 ) );
+
+ } else {
+ // In some edge-cases we won't have defined an object but rather a full URL.
+ $meta['og:image'] = $mainImage;
+ $bannerImage = $mainImage;
+ }
+ } elseif ( $isMainpage ) {
+ $meta['og:image'] = wfExpandUrl( $wgLogo );
+ }
+ $description = $parserOutput->getProperty( 'description' );
+ if ( $description !== false ) { // set by Description2 extension, install it if you want proper og:description support
+ $meta['og:description'] = $description;
+ }
+ $meta['og:url'] = $title->getFullURL();
+ if ( $egFacebookAppId ) {
+ $meta['fb:app_id'] = $egFacebookAppId;
+ }
+ if ( $egFacebookAdmins ) {
+ $meta['fb:admins'] = $egFacebookAdmins;
+ }
+
+ foreach ( $meta as $property => $value ) {
+ if ( $value ) {
+ $out->addHeadItem(
+ "meta:property:$property",
+ ' ' . Html::element( 'meta', [
+ 'property' => $property,
+ 'content' => $value
+ ] ) . "\n"
+ );
+ }
+ }
+ $out->addScript("<style>.bannerimage {background-image:url('{$bannerImage}');}</style>");
+ }
+
+}