2 namespace TYPO3\CMS\Core\Database;
87 $this->fileAdminDir = !empty(
$GLOBALS[
'TYPO3_CONF_VARS'][
'BE'][
'fileadminDir']) ? rtrim(
$GLOBALS[
'TYPO3_CONF_VARS'][
'BE'][
'fileadminDir'],
'/') :
'fileadmin';
102 public function findRef($table, $field, $uid, $content, $spKey, $spParams, $structurePath =
'')
105 $this->tokenID_basePrefix = $table .
':' . $uid .
':' . $field .
':' . $structurePath .
':' . $spKey;
109 $resultArray = array(
112 'matchString' => $content
116 $retVal = $resultArray;
120 $resultArray = array(
121 'content' =>
'{softref:' . $tokenID .
'}',
124 'matchString' => $content,
127 'tokenID' => $tokenID,
128 'tokenValue' => $content
133 $retVal = $resultArray;
179 $splitContent = $htmlParser->splitTags(
'img', $content);
182 foreach ($splitContent as $k => $v) {
185 $attribs = $htmlParser->get_tag_attributes($v);
186 $srcRef = htmlspecialchars_decode($attribs[0][
'src']);
187 $pI = pathinfo($srcRef);
190 if (!$pI[
'scheme'] && !$pI[
'query'] && $absPath && $srcRef !==
'clear.gif') {
193 $elements[$k] = array();
194 $elements[$k][
'matchString'] = $v;
199 if (strstr($splitContent[$k], $attribs[0][
'src'])) {
201 $splitContent[$k] = str_replace($attribs[0][
'src'],
'{softref:' . $tokenID .
'}', $splitContent[$k]);
202 $elements[$k][
'subst'] = array(
204 'relFileName' => $srcRef,
205 'tokenID' => $tokenID,
206 'tokenValue' => $attribs[0][
'src']
209 if (!@is_file($absPath)) {
210 $elements[$k][
'error'] =
'File does not exist!';
213 $elements[$k][
'error'] =
'Could not substitute image source with token!';
220 if (!empty($elements)) {
221 $resultArray = array(
222 'content' => implode(
'', $splitContent),
223 'elements' => $elements
242 if (is_array($spParams) && in_array(
'linkList', $spParams)) {
244 $linkElement = explode(
',', $content);
247 $linkElement = array($content);
251 foreach ($linkElement as $k => $typolinkValue) {
256 if (!empty($elements)) {
257 $resultArray = array(
258 'content' => implode(
',', $linkElement),
259 'elements' => $elements
278 $linkTags = $htmlParser->splitTags(
'link', $content);
281 foreach ($linkTags as $k => $foundValue) {
283 $typolinkValue = preg_replace(
'/<LINK[[:space:]]+/i',
'', substr($foundValue, 0, -1));
289 if (!empty($elements)) {
290 $resultArray = array(
291 'content' => implode(
'', $linkTags),
292 'elements' => $elements
311 $splitContent = $htmlParser->splitTags(
'img,a,form', $content);
313 foreach ($splitContent as $k => $v) {
315 $attribs = $htmlParser->get_tag_attributes($v);
317 switch ($htmlParser->getFirstTagName($v)) {
319 $attributeName =
'src';
322 $attributeName =
'href';
325 $attributeName =
'action';
329 if (isset($attribs[0][$attributeName])) {
330 $srcRef = htmlspecialchars_decode($attribs[0][$attributeName]);
333 $elements[$k] = array();
334 $elements[$k][
'matchString'] = $v;
336 $pI = pathinfo($srcRef);
341 if (strstr($splitContent[$k], $attribs[0][$attributeName])) {
342 $splitContent[$k] = str_replace($attribs[0][$attributeName],
'{softref:' . $tokenID .
'}', $splitContent[$k]);
343 $elements[$k][
'subst'] = array(
345 'relFileName' => $srcRef,
346 'tokenID' => $tokenID,
347 'tokenValue' => $attribs[0][$attributeName]
349 if (!@is_file($absPath)) {
350 $elements[$k][
'error'] =
'File does not exist!';
353 $elements[$k][
'error'] =
'Could not substitute attribute (' . $attributeName .
') value with token!';
359 $content = implode(
'', $splitContent);
363 if (!empty($elements)) {
364 $resultArray = array(
365 'content' => $content,
366 'elements' => $elements
386 if (!empty($elements)) {
387 $resultArray = array(
388 'content' => $content,
389 'elements' => $elements
404 $resultArray = array();
406 $parts = preg_split(
'/([^[:alnum:]]+)([A-Za-z0-9\\._-]+[@][A-Za-z0-9\\._-]+[\\.].[A-Za-z0-9]+)/',
' ' . $content .
' ', 10000, PREG_SPLIT_DELIM_CAPTURE);
407 foreach ($parts as $idx => $value) {
410 $elements[$idx] = array();
411 $elements[$idx][
'matchString'] = $value;
412 if (is_array($spParams) && in_array(
'subst', $spParams)) {
413 $parts[$idx] =
'{softref:' . $tokenID .
'}';
414 $elements[$idx][
'subst'] = array(
416 'tokenID' => $tokenID,
417 'tokenValue' => $value
423 if (!empty($elements)) {
424 $resultArray = array(
425 'content' => substr(implode(
'', $parts), 1, -1),
426 'elements' => $elements
441 $resultArray = array();
443 $parts = preg_split(
'/([^[:alnum:]"\']+)((http|ftp):\\/\\/[^[:space:]"\'<>]*)([[:space:]])/',
' ' . $content .
' ', 10000, PREG_SPLIT_DELIM_CAPTURE);
444 foreach ($parts as $idx => $value) {
450 $elements[$idx] = array();
451 $elements[$idx][
'matchString'] = $value;
452 if (is_array($spParams) && in_array(
'subst', $spParams)) {
453 $parts[$idx] =
'{softref:' . $tokenID .
'}';
454 $elements[$idx][
'subst'] = array(
456 'tokenID' => $tokenID,
457 'tokenValue' => $value
463 if (!empty($elements)) {
464 $resultArray = array(
465 'content' => substr(implode(
'', $parts), 1, -1),
466 'elements' => $elements
481 $resultArray = array();
483 $parts = preg_split(
'/([^[:alnum:]"\']+)(EXT:[[:alnum:]_]+\\/[^[:space:]"\',]*)/',
' ' . $content .
' ', 10000, PREG_SPLIT_DELIM_CAPTURE);
484 foreach ($parts as $idx => $value) {
487 $elements[$idx] = array();
488 $elements[$idx][
'matchString'] = $value;
492 if (!empty($elements)) {
493 $resultArray = array(
494 'content' => substr(implode(
'', $parts), 1, -1),
495 'elements' => $elements
517 $parts = preg_split(
'/([^[:alnum:]]+)(' . preg_quote($this->fileAdminDir,
'/') .
'\\/[^[:space:]"\'<>]*)/',
' ' . $content .
' ', 10000, PREG_SPLIT_DELIM_CAPTURE);
519 foreach ($parts as $idx => $value) {
522 $tokenID = $this->
makeTokenID(
'fileadminReferences:' . $idx);
523 $elements[
'fileadminReferences.' . $idx] = array();
524 $elements[
'fileadminReferences.' . $idx][
'matchString'] = $value;
525 $elements[
'fileadminReferences.' . $idx][
'subst'] = array(
527 'relFileName' => $value,
528 'tokenID' => $tokenID,
529 'tokenValue' => $value
531 $parts[$idx] =
'{softref:' . $tokenID .
'}';
534 if (!@is_file($absPath)) {
535 $elements[
'fileadminReferences.' . $idx][
'error'] =
'File does not exist!';
540 return substr(implode(
'', $parts), 1, -1);
558 $link_param = $finalTagParts[
'url'];
560 unset($finalTagParts[
'url']);
563 $pU = @parse_url($link_param);
566 if (strstr($link_param,
'@') && !$pU[
'scheme']) {
567 $link_param = preg_replace(
'/^mailto:/i',
'', $link_param);
568 $finalTagParts[
'LINK_TYPE'] =
'mailto';
569 $finalTagParts[
'url'] = trim($link_param);
570 return $finalTagParts;
573 list($linkHandlerKeyword, $linkHandlerValue) = explode(
':', trim($link_param), 2);
576 $linkHandlerFound =
false;
577 list($linkHandlerFound, $finalTagParts) = $this->
emitGetTypoLinkParts($linkHandlerFound, $finalTagParts, $linkHandlerKeyword, $linkHandlerValue);
578 if ($linkHandlerFound) {
579 return $finalTagParts;
583 if ($linkHandlerKeyword ===
'file') {
584 $finalTagParts[
'LINK_TYPE'] =
'file';
585 $finalTagParts[
'identifier'] = trim($link_param);
586 return $finalTagParts;
590 $fileChar = (int)strpos($link_param,
'/');
591 $urlChar = (int)strpos($link_param,
'.');
594 list($rootFileDat) = explode(
'?', rawurldecode($link_param));
595 $containsSlash = strstr($rootFileDat,
'/');
596 $rFD_fI = pathinfo($rootFileDat);
597 if (trim($rootFileDat) && !$containsSlash && (@is_file(PATH_site . $rootFileDat) ||
GeneralUtility::inList(
'php,html,htm', strtolower($rFD_fI[
'extension'])))) {
599 }
elseif ($containsSlash) {
603 if ($pU[
'scheme'] || ($isLocalFile != 1 && $urlChar && (!$containsSlash || $urlChar < $fileChar))) {
604 $finalTagParts[
'LINK_TYPE'] =
'url';
605 $finalTagParts[
'url'] = $link_param;
606 }
elseif ($containsSlash || $isLocalFile) {
607 $splitLinkParam = explode(
'?', $link_param);
608 if (file_exists(rawurldecode($splitLinkParam[0])) || $isLocalFile) {
609 $finalTagParts[
'LINK_TYPE'] =
'file';
610 $finalTagParts[
'filepath'] = rawurldecode($splitLinkParam[0]);
611 $finalTagParts[
'query'] = $splitLinkParam[1];
616 $finalTagParts[
'LINK_TYPE'] =
'page';
618 $link_params_parts = explode(
'#', $link_param);
620 $link_param = trim($link_params_parts[0]);
622 if ((
string)$link_params_parts[1] !==
'') {
623 $finalTagParts[
'anchor'] = trim($link_params_parts[1]);
628 if (count($pairParts) > 1) {
629 $link_param = $pairParts[0];
630 $finalTagParts[
'type'] = $pairParts[1];
634 if ((
string)$link_param !==
'') {
636 $finalTagParts[
'alias'] = $link_param;
640 $finalTagParts[
'page_id'] = (int)$link_param;
644 return $finalTagParts;
660 $tokenID = $this->
makeTokenID(
'setTypoLinkPartsElement:' . $idx);
661 $elements[$tokenID .
':' . $idx] = array();
662 $elements[$tokenID .
':' . $idx][
'matchString'] = $content;
664 switch ((
string)$tLP[
'LINK_TYPE']) {
669 $elements[$tokenID .
':' . $idx][
'subst'] = array(
671 'tokenID' => $tokenID,
672 'tokenValue' => $tLP[
'url']
675 $content =
'{softref:' . $tokenID .
'}';
679 if ($tLP[
'identifier']) {
680 list($linkHandlerKeyword, $linkHandlerValue) = explode(
':', trim($tLP[
'identifier']), 2);
683 $elements[$tokenID .
':' . $idx][
'subst'] = array(
685 'recordRef' =>
'sys_file:' . $linkHandlerValue,
686 'tokenID' => $tokenID,
687 'tokenValue' => $tLP[
'identifier'],
690 $content =
'{softref:' . $tokenID .
'}';
697 }
elseif (!$tLP[
'query']) {
702 $elements[$tokenID .
':' . $idx][
'subst'] = array(
704 'relFileName' => $tLP[
'filepath'],
705 'tokenID' => $tokenID,
706 'tokenValue' => $tLP[
'filepath']
710 if (!@is_file($absPath)) {
711 $elements[$tokenID .
':' . $idx][
'error'] =
'File does not exist!';
714 $content =
'{softref:' . $tokenID .
'}';
726 if ($tLP[
'page_id']) {
727 $content .=
'{softref:' . $tokenID .
'}';
728 $elements[$tokenID .
':' . $idx][
'subst'] = array(
730 'recordRef' =>
'pages:' . $tLP[
'page_id'],
731 'tokenID' => $tokenID,
732 'tokenValue' => $tLP[
'alias'] ? $tLP[
'alias'] : $tLP[
'page_id']
736 if ((
string)$tLP[
'type'] !==
'') {
737 $content .=
',' . $tLP[
'type'];
740 if ((
string)$tLP[
'anchor'] !==
'') {
744 $newTokenID = $this->
makeTokenID(
'setTypoLinkPartsElement:anchor:' . $idx);
745 $elements[$newTokenID .
':' . $idx] = array();
746 $elements[$newTokenID .
':' . $idx][
'matchString'] =
'Anchor Content Element: ' . $tLP[
'anchor'];
747 $content .=
'#{softref:' . $newTokenID .
'}';
748 $elements[$newTokenID .
':' . $idx][
'subst'] = array(
750 'recordRef' =>
'tt_content:' . $tLP[
'anchor'],
751 'tokenID' => $newTokenID,
752 'tokenValue' => $tLP[
'anchor']
756 $content .=
'#' . $tLP[
'type'];
761 $linkHandlerFound =
false;
762 list($linkHandlerFound, $tLP, $content, $newElements) = $this->
emitSetTypoLinkPartsElement($linkHandlerFound, $tLP, $content, $elements, $idx, $tokenID);
764 \TYPO3\CMS\Core\Utility\ArrayUtility::mergeRecursiveWithOverrule($elements, $newElements);
766 if (!$linkHandlerFound) {
767 $elements[$tokenID .
':' . $idx][
'error'] =
'Couldn\'t decide typolink mode.';
772 $tLP[
'url'] = $content;
787 $pRec = \TYPO3\CMS\Backend\Utility\BackendUtility::getRecordsByField(
'pages',
'alias', $link_param);
788 return $pRec[0][
'uid'];
799 return md5($this->tokenID_basePrefix .
':' . $index);
817 protected function emitGetTypoLinkParts($linkHandlerFound, $finalTagParts, $linkHandlerKeyword, $linkHandlerValue)
819 return $this->
getSignalSlotDispatcher()->dispatch(get_class($this),
'getTypoLinkParts', array($linkHandlerFound, $finalTagParts, $linkHandlerKeyword, $linkHandlerValue));
833 return $this->
getSignalSlotDispatcher()->dispatch(get_class($this),
'setTypoLinkPartsElement', array($linkHandlerFound, $tLP, $content, $elements, $idx, $tokenID, $this));