-
Notifications
You must be signed in to change notification settings - Fork 58
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added PhotoSwipe plugin. PhotoSwipe and Gallery captions plugins are …
…activated by default.
- Loading branch information
Showing
21 changed files
with
6,501 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -28,5 +28,7 @@ | |
'readmore', | ||
'favicon', | ||
'commentcenter', | ||
'mediamanager' | ||
'mediamanager', | ||
'gallerycaptions', | ||
'photoswipe' | ||
); |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
<?php | ||
// Phrases for the frontend | ||
$lang ['plugin'] ['photoswipe'] = array( | ||
'tooltip_closebutton' => 'Schließen (Esc)', | ||
'tooltip_sharebutton' => 'Teilen', | ||
'tooltip_fullscreenbutton' => 'Vollbildansicht', | ||
'tooltip_zoombutton' => 'Zoom', | ||
'tooltip_autoplaybutton' => 'Slideshow starten', | ||
'tooltip_prevbutton' => 'Voriges Bild (Pfeiltaste links)', | ||
'tooltip_nextbutton' => 'Nächstes Bild (Pfeiltaste rechts)', | ||
'label_gallerydoesntexist' => 'Galerie existiert nicht:', | ||
'label_imagedoesntexist' => 'Bild existiert nicht:' | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
<?php | ||
// Phrases for the frontend | ||
$lang ['plugin'] ['photoswipe'] = array( | ||
'tooltip_closebutton' => 'Close (Esc key)', | ||
'tooltip_sharebutton' => 'Share', | ||
'tooltip_fullscreenbutton' => 'Full screen', | ||
'tooltip_zoombutton' => 'Zoom', | ||
'tooltip_autoplaybutton' => 'Start slide show', | ||
'tooltip_prevbutton' => 'Previous image (left key)', | ||
'tooltip_nextbutton' => 'Next image (right key)', | ||
'label_gallerydoesntexist' => 'Gallery does not exist:', | ||
'label_imagedoesntexist' => 'Image does not exist:' | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,303 @@ | ||
<?php | ||
|
||
/** | ||
* Static functions for the plugin. | ||
*/ | ||
class PhotoSwipeFunctions { | ||
|
||
/** | ||
* Class-wide flag that the PhotoSwipe overlay UI has already been initialized | ||
* | ||
* @var boolean | ||
*/ | ||
private static $photoswipeUiIsInitialized = false; | ||
|
||
/** | ||
* Class-wide index counter for the shown images | ||
* | ||
* @var int | ||
*/ | ||
private static $lastusedDataIndex = 0; | ||
|
||
/** | ||
* Callback function called for [img] tags which returns the HTML code for a single PhotoSwipe image. | ||
* | ||
* @param string $action | ||
* @param array $attr | ||
* the attributes given in the tag | ||
* @param string $content | ||
* @param array $params | ||
* @param string $node_object | ||
* @return boolean|string the HTML code for a single PhotoSwipe image | ||
*/ | ||
static function getImageHtml($action, $attr, $content, $params, $node_object) { | ||
global $lang; | ||
|
||
if ($action == 'validate') { | ||
// not used for now | ||
return true; | ||
} | ||
|
||
// the name of the image - and its relative path | ||
$img = $attr ['default']; | ||
|
||
// sanitize first | ||
if (strpos($img, '..') !== false) { | ||
return $lang ['plugin'] ['photoswipe'] ['label_imagedoesntexist']; | ||
} | ||
$imgPathRel = 'fp-content/' . $img; | ||
$imgUrl = BLOG_BASEURL . 'fp-content/' . $img; | ||
|
||
// check if dir exists | ||
if (!file_exists($imgPathRel)) { | ||
return $lang ['plugin'] ['photoswipe'] ['label_imagedoesntexist'] . ' ' . $img; | ||
} | ||
|
||
// image title will be its file name - or the title from the tag attributes, if given | ||
$title = isset($attr ['title']) ? $attr ['title'] : ''; | ||
// for usage in HTML attributes, we need to remove quotes and HTML tags from the title | ||
$titleForAttributes = isset($attr ['title']) ? htmlentities(strip_tags($attr ['title'])) : ''; | ||
|
||
// image may float, according the the given float attribute | ||
$float = ' class="thumbnail nofloat" '; | ||
if (isset($attr ['float'])) { | ||
$float = ' class="thumbnail float' . $attr ['float'] . '"'; | ||
} | ||
|
||
// to get the HTML code for preview image, we use the Flatpress standard function do_bbcode_img() | ||
$attr ['title'] = $titleForAttributes; | ||
$previewHtml = do_bbcode_img(null, $attr, null, null, null); | ||
// but: we don't need the popup link surrounding the resulting <img> tag | ||
$matches = null; | ||
preg_match('/<img[^>]*/u', $previewHtml, $matches); | ||
$previewHtml = $matches [0]; | ||
if ($previewHtml [strlen($previewHtml) - 1] === '/') { | ||
$previewHtml = substr($previewHtml, 0, strlen($previewHtml) - 1); | ||
} | ||
// add some additional attributes to the <img> tag and close it properly | ||
$previewHtml .= ' itemprop="thumbnail" title="' . $titleForAttributes . '">'; | ||
|
||
// PhotoSwipe needs to know the dimensions of the image - so we read them | ||
$imgsize = getimagesize($imgPathRel); | ||
|
||
// now lets assemble the whole HTML code - including the overlay HTML, if not inserted into the DOM before | ||
$imgHtml = self::getPhotoSwipeOverlay() . // | ||
'<div class="photoswipe"> | ||
<figure ' . // | ||
'itemprop="associatedMedia" ' . // | ||
'itemscope ' . // | ||
'itemtype="http://schema.org/ImageObject" ' . // | ||
'data-index="' . self::$lastusedDataIndex . '" ' . // | ||
$float . ' ' . // | ||
'>' . // | ||
'<a ' . // | ||
'href="' . $imgUrl . '" ' . // | ||
'itemprop="contentUrl" ' . // | ||
'data-size="' . $imgsize [0] . 'x' . $imgsize [1] . '" ' . // | ||
'data-index="' . self::$lastusedDataIndex . '" ' . // | ||
'title="' . htmlentities($title) . '" ' . // | ||
'>' . // | ||
$previewHtml . // | ||
'</a>' . // | ||
'<figcaption>' . $title . '</figcaption>' . // | ||
'</figure>' . // | ||
'</div>'; | ||
|
||
self::$lastusedDataIndex++; | ||
return $imgHtml; | ||
} | ||
|
||
/** | ||
* Callback function called for [gallery] tags which returns the HTML code for a PhotoSwipe gallery. | ||
* | ||
* @param string $action | ||
* @param array $attr | ||
* the attributes given in the tag | ||
* @param string $content | ||
* @param array $params | ||
* @param string $node_object | ||
* @return boolean|string the HTML code for a PhotoSwipe gallery | ||
*/ | ||
static function getGalleryHtml($action, $attr, $content, $params, $node_object) { | ||
global $lang; | ||
if ($action == 'validate') { | ||
// not used for now | ||
return true; | ||
} | ||
|
||
// gallery dir is set as tag attribute | ||
$dir = $attr ['default']; | ||
|
||
// sanitize first | ||
if (strpos($dir, '..') !== false) { | ||
return $lang ['plugin'] ['photoswipe'] ['label_gallerydoesntexist']; | ||
} | ||
// check if dir exists | ||
if (!file_exists("fp-content/" . $dir)) { | ||
return $lang ['plugin'] ['photoswipe'] ['label_gallerydoesntexist'] . ' ' . $dir; | ||
} | ||
// force slash at the end | ||
if (substr($dir, -1) != '/') { | ||
$dir .= '/'; | ||
} | ||
|
||
// read images from gallery directory | ||
$imagefiles = gallery_read_images($dir); | ||
|
||
// read image caption from captions file (if existant in the gallery directory) | ||
$captions = gallery_read_captions($dir); | ||
|
||
// call getImageHtml() to get the image's HTML code for each image in the gallery dir | ||
$imgattr = $attr; | ||
$str = '<div class="img-gallery ' . sanitize_title($dir) . '">'; | ||
foreach ($imagefiles as $f) { | ||
// set the image's caption as title attribut of the img tag | ||
$imgattr ['default'] = $dir . $f; | ||
$imgattr ['title'] = array_key_exists($f, $captions) ? $captions [$f] : ''; | ||
$str .= self::getImageHtml($action, $imgattr, $content, $params, $node_object); | ||
} | ||
return $str . '</div>'; | ||
} | ||
|
||
/** | ||
* Returns the overlay HTML. | ||
* This needs to be inserted into the DOM only once, so a second call will return an empty string. | ||
* | ||
* @return string the PhotoSwipe overlay HTML | ||
*/ | ||
static function getPhotoSwipeOverlay() { | ||
global $lang; | ||
|
||
$photoswipeoverlay = self::$photoswipeUiIsInitialized ? '' : '<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">' . // | ||
'<div class="pswp__bg"></div>' . // | ||
'<div class="pswp__scroll-wrap">' . // | ||
'<div class="pswp__container">' . // | ||
'<div class="pswp__item"></div>' . // | ||
'<div class="pswp__item"></div>' . // | ||
'<div class="pswp__item">' . // | ||
'</div>' . // | ||
'</div>' . // | ||
'<div class="pswp__ui pswp__ui--hidden">' . // | ||
'<div class="pswp__top-bar">' . // | ||
'<div class="pswp__counter"></div>' . // | ||
'<button class="pswp__button pswp__button--close" title="' . $lang ['plugin'] ['photoswipe'] ['tooltip_closebutton'] . '"></button>' . // | ||
'<button class="pswp__button pswp__button--share" title="' . $lang ['plugin'] ['photoswipe'] ['tooltip_sharebutton'] . '"></button>' . // | ||
'<button class="pswp__button pswp__button--fs" title="' . $lang ['plugin'] ['photoswipe'] ['tooltip_fullscreenbutton'] . '"></button>' . // | ||
'<button class="pswp__button pswp__button--zoom" title="' . $lang ['plugin'] ['photoswipe'] ['tooltip_zoombutton'] . '"></button>' . // | ||
'<div class="pswp__preloader">' . // | ||
'<div class="pswp__preloader__icn">' . // | ||
'<div class="pswp__preloader__cut">' . // | ||
'<div class="pswp__preloader__donut"></div>' . // | ||
'</div>' . // | ||
'</div>' . // | ||
'</div>' . // | ||
'</div>' . // | ||
'<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">' . // | ||
'<div class="pswp__share-tooltip"></div>' . // | ||
'</div>' . // | ||
'<button class="pswp__button pswp__button--arrow--left" title="' . $lang ['plugin'] ['photoswipe'] ['tooltip_prevbutton'] . '"></button>' . // | ||
'<button class="pswp__button pswp__button--arrow--right" title="' . $lang ['plugin'] ['photoswipe'] ['tooltip_nextbutton'] . '"></button>' . // | ||
'<div class="pswp__caption">' . // | ||
'<div class="pswp__caption__center"></div>' . // | ||
'</div>' . // | ||
'</div>' . // | ||
'</div>' . // | ||
'</div>'; | ||
self::$photoswipeUiIsInitialized = true; | ||
return $photoswipeoverlay; | ||
} | ||
|
||
/** | ||
* Header hook for loading the PhotoSwipe scripts. | ||
* Echoes the <script> tags. | ||
*/ | ||
static function echoScriptTags() { | ||
$pdir = plugin_geturl('photoswipe'); | ||
echo '<!-- PhotoSwipe --> | ||
'; | ||
if (!function_exists('plugin_jquery_head')) { | ||
echo '<script src="' . $pdir . 'res/jquery-2.2.2/jquery-2.2.2.min.js"></script> | ||
'; | ||
} | ||
echo ' | ||
<script src="' . $pdir . 'res/photoswipe-4.1.1/photoswipe-ui-default.min.js"></script> | ||
<script src="' . $pdir . 'res/photoswipe-4.1.1/photoswipe.min.js"></script> | ||
<scripst src="' . $pdir . 'res/photoswipe.js.php"> | ||
<script>'; | ||
include_once (dirname(__FILE__) . '/res/photoswipe.js.php'); | ||
echo ' | ||
</script> | ||
<link rel="stylesheet" property="stylesheet" href="' . $pdir . 'res/photoswipe-4.1.1/default-skin/default-skin.css"> | ||
<link media="screen" href="' . $pdir . 'res/photoswipe-4.1.1/photoswipe.css" type="text/css" rel="stylesheet"> | ||
<!-- /PhotoSwipe -->'; | ||
} | ||
|
||
/** | ||
* Initializes the BBCode tags of the plugin. | ||
*/ | ||
public static function initializePluginTags() { | ||
// At first: check if BBCode plugin is active | ||
if (!function_exists('plugin_bbcode_init')) { | ||
// if not, there's no use in adding any bbcode tags :) | ||
return; | ||
} | ||
|
||
// get the global bbcode object | ||
$bbcode = plugin_bbcode_init(); | ||
|
||
// gallery tags | ||
$supportedGalleryTags = array( | ||
'gallery', // default tag | ||
'photoswipegallery' // legacy tag - maintaining compatibility with plugin versions <= 1.1 | ||
); | ||
foreach ($supportedGalleryTags as $tag) { | ||
// add gallery tag | ||
$bbcode->addCode($tag, // tag name: this will go between square brackets | ||
'callback_replace_single', // type of action: we'll use a callback function | ||
'PhotoSwipeFunctions::getGalleryHtml', // name of the callback function | ||
array( | ||
'usecontent_param' => array( | ||
'default' | ||
) | ||
), // supported parameters: "default" is [acronym=valore] | ||
'inline', // type of the tag, inline or block, etc | ||
array( | ||
'listitem', | ||
'block', | ||
'inline', | ||
'link' | ||
), // type of elements in which you can use this tag | ||
array()); // type of elements where this tag CAN'T go (in this case, none, so it can go everywhere) | ||
$bbcode->setCodeFlag($tag, 'closetag', BBCODE_CLOSETAG_FORBIDDEN); // a closing tag is forbidden (no [/tag]) | ||
} | ||
|
||
// single image tags | ||
$supportedImageTags = array( | ||
'img', // default tag | ||
'photoswipeimage' // legacy tag - maintaining compatibility with plugin versions <= 1.1 | ||
); | ||
foreach ($supportedImageTags as $tag) { | ||
// at first: remove tag to make sure it will be overridden | ||
$bbcode->removeCode($tag); | ||
// add image tag | ||
$bbcode->addCode($tag, // tag name: this will go between square brackets | ||
'callback_replace_single', // type of action: we'll use a callback function | ||
'PhotoSwipeFunctions::getImageHtml', // name of the callback function | ||
array( | ||
'usecontent_param' => array( | ||
'default' | ||
) | ||
), // supported parameters: "default" is [acronym=valore] | ||
'inline', // type of the tag, inline or block, etc | ||
array( | ||
'listitem', | ||
'block', | ||
'inline', | ||
'link' | ||
), // type of elements in which you can use this tag | ||
array()); // type of elements where this tag CAN'T go (in this case, none, so it can go everywhere) | ||
$bbcode->setCodeFlag($tag, 'closetag', BBCODE_CLOSETAG_FORBIDDEN); // a closing tag is forbidden (no [/tag]) | ||
} | ||
} | ||
|
||
} |
Oops, something went wrong.