marc-leopold/cms/plugins/graker/photoalbums/classes/MarkdownPhotoInsert.php

118 lines
3.6 KiB
PHP

<?php
namespace Graker\PhotoAlbums\Classes;
use Graker\PhotoAlbums\Models\Photo;
/**
* Class MarkdownPhotoInsert
* Parses Markdown text to replace [photo:123:640:480:auto] placeholders with links to actual images from photo gallery
*
* @package Graker\PhotoAlbums\Classes
*/
class MarkdownPhotoInsert {
const PHOTO_A_REGEXP = '(href=\"(\[photo\:[0-9]+(?:\:[0-9]+\:[0-9]+(?:\:auto|\:exact|\:portrait|\:landscape|\:crop)?)?\])\")';
const PHOTO_IMG_REGEXP = '(src=\"(\[photo\:[0-9]+(?:\:[0-9]+\:[0-9]+(?:\:auto|\:exact|\:portrait|\:landscape|\:crop)?)?\])\")';
/**
*
* Replace [photo:123:640:480:auto] placeholders with links to actual images from photo gallery
* where
* - photo is a constant string
* - 123 is a photo id
* - 640:480 is an optional size of thumbnail to be created
* - auto is an optional crop mode to be used
* Placeholders are allowed (i.e. replaced) only inside `src=""` and `href=""`
*
* @param string $text original text
* @param \stdClass $data contains text property with text processed so far
*/
public function parse($text, $data) {
$images = array();
$links = array();
preg_match_all(self::PHOTO_A_REGEXP, $data->text, $links, PREG_SET_ORDER);
preg_match_all(self::PHOTO_IMG_REGEXP, $data->text, $images, PREG_SET_ORDER);
if (!empty($images)) {
$data->text = $this->replaceMatches($images, $data->text);
}
if (!empty($links)) {
$data->text = $this->replaceMatches($links, $data->text);
}
}
/**
*
* Goes over all matches and replaces them in text
* Returns processed text
*
* @param $matches
* @param $text
* @return mixed
*/
protected function replaceMatches($matches, $text) {
foreach ($matches as $match) {
list($entry, $placeholder) = $match;
$replacement = $this->getReplacement($entry, $placeholder);
$text = str_replace($entry, $replacement, $text);
}
return $text;
}
/**
*
* Returns replacement for text
* (replaces [photo:id:width:height:mode] with resulting photo's image path)
*
* @param $entry
* @param $placeholder
* @return string
*/
protected function getReplacement($entry, $placeholder) {
list($id, $width, $height, $mode) = $this->getPhotoParams($placeholder);
$photo = Photo::where('id', $id)
->with('image')
->first();
if (!$photo) {
return $placeholder;
} else {
if ($width && $height) {
$path = $photo->image->getThumb($width, $height, ['mode' => $mode]);
} else {
$path = $photo->image->path;
}
return str_replace($placeholder, $path, $entry);
}
}
/**
*
* Parses parameters of image from the tag and returns them in array
* [$id, $width, $height, $mode]
* Width, height and mode are optional and will return 0 and empty string
* if omitted in the tag
*
* @param string $placeholder
* @return array
*/
protected function getPhotoParams($placeholder) {
// remove brackets
$values = str_replace('[', '', $placeholder);
$values = str_replace(']', '', $values);
// get parameters
$values = explode(':', $values);
$id = $values[1];
$width = isset($values[2]) ? $values[2] : 0;
$height = isset($values[3]) ? $values[3] : 0;
$mode = isset($values[4]) ? $values[4] : 'auto';
return array($id, $width, $height, $mode);
}
}