Файл: concrete5.7.5.6/concrete/src/Editor/LinkAbstractor.php
Строк: 222
<?php
/**
* Contains functions that converts full urls to and from
* site pages, files (downloads and inline views), and snippets.
* The purpose of this conversion is so that links to things
* within a website are properly maintained when a page or file
* is moved, or if an entire site is moved to a different directory
* on the server (or to a different server).
*/
namespace ConcreteCoreEditor;
use Core;
use File;
use Page;
use Loader;
use URL;
use SunraPhpSimpleHtmlDomParser;
use ConcreteCoreFoundationObject;
class LinkAbstractor extends Object
{
/**
* Takes a chunk of content containing full urls
* and converts them to abstract link references.
*/
private static $blackListImgAttributes = array('src', 'fid', 'data-verified', 'data-save-url');
public static function translateTo($text)
{
// images inline
$imgmatch = URL::to('/download_file', 'view_inline');
$imgmatch = str_replace('/', '/', $imgmatch);
$imgmatch = str_replace('-', '-', $imgmatch);
$imgmatch = '/' . $imgmatch . '/([0-9]+)/i';
$dom = new HtmlDomParser();
$r = $dom->str_get_html($text, true, true, DEFAULT_TARGET_CHARSET, false);
if ($r) {
foreach ($r->find('img') as $img) {
$attrString = "";
foreach ($img->attr as $key => $val) {
if (!in_array($key, self::$blackListImgAttributes)) {
$attrString .= "$key="$val" ";
}
}
if (preg_match($imgmatch, $img->src, $matches)) {
$img->outertext = '<concrete-picture fID="' . $matches[1] . '" ' . $attrString . '/>';
}
}
$text = (string)$r->restore_noise($r);
}
$appUrl = Core::getApplicationURL();
if (!empty($appUrl)) {
$url1 = str_replace('/', '/', $appUrl . '/' . DISPATCHER_FILENAME);
$url2 = str_replace('/', '/', $appUrl);
$url4 = URL::to('/download_file', 'view');
$url4 = str_replace('/', '/', $url4);
$url4 = str_replace('-', '-', $url4);
$text = preg_replace(
array(
'/' . $url1 . '?cID=([0-9]+)/i',
'/' . $url4 . '/([0-9]+)/i',
'/' . $url2 . '/i'
),
array(
'{CCM:CID_\1}',
'{CCM:FID_DL_\1}',
'{CCM:BASE_URL}'
)
,
$text
);
}
return $text;
}
/**
* Takes a chunk of content containing abstracted link references,
* and expands them to full urls for displaying on the site front-end.
*/
public static function translateFrom($text)
{
$text = preg_replace(
array(
'/{CCM:BASE_URL}/i'
),
array(
Core::getApplicationURL(),
),
$text
);
// now we add in support for the links
$text = preg_replace_callback(
'/{CCM:CID_([0-9]+)}/i',
function ($matches) {
$cID = $matches[1];
if ($cID > 0) {
$c = Page::getByID($cID, 'ACTIVE');
return Loader::helper("navigation")->getLinkToCollection($c);
}
},
$text
);
// now we add in support for the files that we view inline
$dom = new HtmlDomParser();
$r = $dom->str_get_html($text, true, true, DEFAULT_TARGET_CHARSET, false);
if (is_object($r)) {
foreach ($r->find('concrete-picture') as $picture) {
$fID = $picture->fid;
$fo = File::getByID($fID);
if (is_object($fo)) {
// move width px to width attribute and height px to height attribute
$widthPattern = "/(?:^width|[^-]width):\s([0-9]+)px;?/i";
if (preg_match($widthPattern, $picture->style, $matches)) {
$picture->style = preg_replace($widthPattern, '', $picture->style);
$picture->width = $matches[1];
}
$heightPattern = "/(?:^height|[^-]height):\s([0-9]+)px;?/i";
if (preg_match($heightPattern, $picture->style, $matches)) {
$picture->style = preg_replace($heightPattern, '', $picture->style);
$picture->height = $matches[1];
}
$picture->style = trim($picture->style);
$image = new ConcreteCoreHtmlImage($fo);
$tag = $image->getTag();
foreach ($picture->attr as $attr => $val) {
if (!in_array($attr, self::$blackListImgAttributes)) {
//Apply attributes to child img, if using picture tag.
if ($tag instanceof ConcreteCoreHtmlObjectPicture) {
foreach ($tag->getChildren() as $child) {
if ($child instanceof HtmlObjectImage) {
$child->$attr($val);
}
}
} else {
$tag->$attr($val);
}
}
}
$picture->outertext = (string)$tag;
}
}
$text = (string)$r->restore_noise($r);
}
// now we add in support for the links
$text = preg_replace_callback(
'/{CCM:FID_([0-9]+)}/i',
function ($matches) {
$fID = $matches[1];
if ($fID > 0) {
$f = File::getByID($fID);
return $f->getURL();
}
},
$text
);
// now files we download
$text = preg_replace_callback(
'/{CCM:FID_DL_([0-9]+)}/i',
function ($matches) {
$fID = $matches[1];
if ($fID > 0) {
$c = Page::getCurrentPage();
if (is_object($c)) {
return URL::to('/download_file', 'view', $fID, $c->getCollectionID());
} else {
return URL::to('/download_file', 'view', $fID);
}
}
},
$text
);
// snippets
$snippets = Snippet::getActiveList();
foreach ($snippets as $sn) {
$text = $sn->findAndReplace($text);
}
return $text;
}
/**
* Takes a chunk of content containing abstracted link references,
* and expands them to urls suitable for the rich text editor.
*/
public static function translateFromEditMode($text)
{
$text = preg_replace(
array(
'/{CCM:BASE_URL}/i'
),
array(
Core::getApplicationURL(),
),
$text
);
//page links...
$text = preg_replace(
'/{CCM:CID_([0-9]+)}/i',
Core::getApplicationURL() . '/' . DISPATCHER_FILENAME . '?cID=\1',
$text
);
//images...
$dom = new HtmlDomParser();
$r = $dom->str_get_html($text, true, true, DEFAULT_TARGET_CHARSET, false);
if (is_object($r)) {
foreach ($r->find('concrete-picture') as $picture) {
$fID = $picture->fid;
$attrString = "";
foreach ($picture->attr as $attr => $val) {
if (!in_array($attr, self::$blackListImgAttributes)) {
$attrString .= "$attr="$val" ";
}
}
$picture->outertext = '<img src="' . URL::to(
'/download_file',
'view_inline',
$fID
) . '" ' . $attrString . '/>';
}
$text = (string)$r->restore_noise($r);
}
// now we add in support for the links
$text = preg_replace_callback(
'/{CCM:FID_([0-9]+)}/i',
function ($matches) {
$fID = $matches[1];
if ($fID > 0) {
return URL::to('/download_file', 'view_inline', $fID);
}
},
$text
);
//file downloads...
$text = preg_replace_callback(
'/{CCM:FID_DL_([0-9]+)}/i',
function ($matches) {
$fID = $matches[1];
if ($fID > 0) {
return URL::to('/download_file', 'view', $fID);
}
},
$text
);
return $text;
}
/**
* For the content block's getImportData() function
*/
public static function import($text)
{
$inspector = Core::make('import/value_inspector');
$result = $inspector->inspect((string) $text);
return $result->getReplacedContent();
}
/**
* For the content block's export() function
*/
public static function export($text)
{
$text = preg_replace_callback(
'/{CCM:CID_([0-9]+)}/i',
array('ConcreteCoreBackupContentExporter', 'replacePageWithPlaceHolderInMatch'),
$text
);
$text = preg_replace_callback(
'/{CCM:FID_DL_([0-9]+)}/i',
array('ConcreteCoreBackupContentExporter', 'replaceFileWithPlaceHolderInMatch'),
$text
);
$dom = new HtmlDomParser();
$r = $dom->str_get_html($text, true, true, DEFAULT_TARGET_CHARSET, false);
if (is_object($r)) {
foreach ($r->find('concrete-picture') as $picture) {
$fID = $picture->fid;
$f = File::getByID($fID);
if (is_object($f)) {
$picture->fid = false;
$picture->file = $f->getFilename();
}
}
$text = (string)$r->restore_noise($r);
}
return $text;
}
}