From 6efc45a25e0ef5d61585c38faaeebb6cf265281f Mon Sep 17 00:00:00 2001
From: Dmitry Katsubo <dmitry.katsubo@gmail.com>
Date: Thu, 20 Oct 2016 00:47:36 +0200
Subject: [PATCH] Implemented interwiki substitution for external images (issue
 #1614).

---
 inc/common.php         | 11 +++++++++++
 inc/parser/handler.php |  6 +++---
 inc/parser/xhtml.php   |  5 +++++
 3 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/inc/common.php b/inc/common.php
index 7f71696cd..ff32fe17a 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -834,6 +834,17 @@ function clientismobile() {
     return false;
 }
 
+/**
+ * check if a given link is interwiki link
+ *
+ * @param string $link the link, e.g. "wiki>page"
+ * @return bool
+ */
+function link_isinterwiki($link){
+    if (preg_match('/^[a-zA-Z0-9\.]+>/u',$link)) return true;
+    return false;
+}
+
 /**
  * Convert one or more comma separated IPs to hostnames
  *
diff --git a/inc/parser/handler.php b/inc/parser/handler.php
index f477d36f8..a5e7f39cd 100644
--- a/inc/parser/handler.php
+++ b/inc/parser/handler.php
@@ -446,7 +446,7 @@ class Doku_Handler {
 
         //decide which kind of link it is
 
-        if ( preg_match('/^[a-zA-Z0-9\.]+>{1}.*$/u',$link[0]) ) {
+        if ( link_isinterwiki($link[0]) ) {
             // Interwiki
             $interwiki = explode('>',$link[0],2);
             $this->_addCall(
@@ -693,8 +693,8 @@ function Doku_Handler_Parse_Media($match) {
         $cache = 'cache';
     }
 
-    // Check whether this is a local or remote image
-    if ( media_isexternal($src) ) {
+    // Check whether this is a local or remote image or interwiki
+    if (media_isexternal($src) || link_isinterwiki($src)){
         $call = 'externalmedia';
     } else {
         $call = 'internalmedia';
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index 2efb1d831..724981820 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -1186,6 +1186,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
      */
     function externalmedia($src, $title = null, $align = null, $width = null,
                            $height = null, $cache = null, $linking = null, $return = false) {
+        if(link_isinterwiki($src)){
+            list($shortcut, $reference) = explode('>', $src, 2);
+            $exists = null;
+            $src = $this->_resolveInterWiki($shortcut, $reference, $exists);
+        }
         list($src, $hash) = explode('#', $src, 2);
         $noLink = false;
         $render = ($linking == 'linkonly') ? false : true;
-- 
GitLab