98 public function findRef($table, $field, $uid, $content, $spKey, $spParams, $structurePath =
'')
101 $this->tokenID_basePrefix = $table .
':' . $uid .
':' . $field .
':' . $structurePath .
':' . $spKey;
108 'matchString' => $content
112 $retVal = $resultArray;
117 'content' =>
'{softref:' . $tokenID .
'}',
120 'matchString' => $content,
123 'tokenID' => $tokenID,
124 'tokenValue' => $content
129 $retVal = $resultArray;
167 $htmlParser = GeneralUtility::makeInstance(\
TYPO3\CMS\Core\Html\HtmlParser::class);
168 $splitContent = $htmlParser->splitTags(
'img', $content);
171 foreach ($splitContent as $k => $v) {
174 $attribs = $htmlParser->get_tag_attributes($v);
175 $srcRef = htmlspecialchars_decode($attribs[0][
'src']);
176 $pI = pathinfo($srcRef);
179 if (!$pI[
'scheme'] && !$pI[
'query'] && $absPath && $srcRef !==
'clear.gif') {
184 $elements[$k][
'matchString'] = $v;
186 if (GeneralUtility::isFirstPartOfStr($srcRef,
'uploads/') && preg_match(
'/^RTEmagicC_/',
PathUtility::basename($srcRef))) {
189 if (strstr($splitContent[$k], $attribs[0][
'src'])) {
191 $splitContent[$k] = str_replace($attribs[0][
'src'],
'{softref:' . $tokenID .
'}', $splitContent[$k]);
192 $elements[$k][
'subst'] = [
194 'relFileName' => $srcRef,
195 'tokenID' => $tokenID,
196 'tokenValue' => $attribs[0][
'src']
199 if (!@is_file($absPath)) {
200 $elements[$k][
'error'] =
'File does not exist!';
203 $elements[$k][
'error'] =
'Could not substitute image source with token!';
210 if (!empty($elements)) {
212 'content' => implode(
'', $splitContent),
213 'elements' => $elements
232 if (is_array($spParams) && in_array(
'linkList', $spParams)) {
234 $linkElement = explode(
',', $content);
237 $linkElement = [$content];
241 foreach ($linkElement as $k => $typolinkValue) {
246 if (!empty($elements)) {
248 'content' => implode(
',', $linkElement),
249 'elements' => $elements
266 $htmlParser = GeneralUtility::makeInstance(HtmlParser::class);
267 $linkService = GeneralUtility::makeInstance(LinkService::class);
268 $linkTags = $htmlParser->splitTags(
'a', $content);
271 foreach ($linkTags as $key => $foundValue) {
273 if (preg_match(
'/href="([^"]+)"/', $foundValue, $matches)) {
275 $linkDetails = $linkService->resolve($matches[1]);
276 if ($linkDetails[
'type'] ===
LinkService::TYPE_FILE && preg_match(
'/file\?uid=(\d+)/', $matches[1], $fileIdMatch)) {
278 $elements[$key][
'matchString'] = $linkTags[$key];
279 $linkTags[$key] = str_replace($matches[1],
'{softref:' . $token .
'}', $linkTags[$key]);
280 $elements[$key][
'subst'] = [
282 'recordRef' =>
'sys_file:' . $fileIdMatch[1],
284 'tokenValue' =>
'file:' . ($linkDetails[
'file'] instanceof
File ? $linkDetails[
'file']->
getUid() : $fileIdMatch[1])
286 } elseif ($linkDetails[
'type'] ===
LinkService::TYPE_PAGE && preg_match(
'/page\?uid=(\d+)#?(\d+)?/', $matches[1], $pageAndAnchorMatches)) {
288 $content =
'{softref:' . $token .
'}';
289 $elements[$key][
'matchString'] = $linkTags[$key];
290 $elements[$key][
'subst'] = [
292 'recordRef' =>
'pages:' . $linkDetails[
'pageuid'],
294 'tokenValue' => $linkDetails[
'pageuid']
296 if (isset($pageAndAnchorMatches[2]) && $pageAndAnchorMatches[2] !==
'') {
300 $newTokenID = $this->
makeTokenID(
'setTypoLinkPartsElement:anchor:' . $key);
301 $elements[$newTokenID .
':' . $key] = [];
302 $elements[$newTokenID .
':' . $key][
'matchString'] =
'Anchor Content Element: ' . $pageAndAnchorMatches[2];
303 $content .=
'#{softref:' . $newTokenID .
'}';
304 $elements[$newTokenID .
':' . $key][
'subst'] = [
306 'recordRef' =>
'tt_content:' . $pageAndAnchorMatches[2],
307 'tokenID' => $newTokenID,
308 'tokenValue' => $pageAndAnchorMatches[2]
312 $content .=
'#' . $pageAndAnchorMatches[2];
315 $linkTags[$key] = str_replace($matches[1], $content, $linkTags[$key]);
318 $elements[$key][
'matchString'] = $linkTags[$key];
319 $linkTags[$key] = str_replace($matches[1],
'{softref:' . $token .
'}', $linkTags[$key]);
320 $elements[$key][
'subst'] = [
321 'type' =>
'external',
323 'tokenValue' => $linkDetails[
'url']
327 $elements[$key][
'matchString'] = $linkTags[$key];
328 $linkTags[$key] = str_replace($matches[1],
'{softref:' . $token .
'}', $linkTags[$key]);
329 $elements[$key][
'subst'] = [
332 'tokenValue' => $linkDetails[
'email']
342 if (!empty($elements)) {
344 'content' => implode(
'', $linkTags),
345 'elements' => $elements
361 $parts = preg_split(
'/([^[:alnum:]]+)([A-Za-z0-9\\._-]+[@][A-Za-z0-9\\._-]+[\\.].[A-Za-z0-9]+)/',
' ' . $content .
' ', 10000, PREG_SPLIT_DELIM_CAPTURE);
362 foreach ($parts as $idx => $value) {
365 $elements[$idx] = [];
366 $elements[$idx][
'matchString'] = $value;
367 if (is_array($spParams) && in_array(
'subst', $spParams)) {
368 $parts[$idx] =
'{softref:' . $tokenID .
'}';
369 $elements[$idx][
'subst'] = [
371 'tokenID' => $tokenID,
372 'tokenValue' => $value
378 if (!empty($elements)) {
380 'content' => substr(implode(
'', $parts), 1, -1),
381 'elements' => $elements
397 $parts = preg_split(
'/([^[:alnum:]"\']+)((https?|ftp):\\/\\/[^[:space:]"\'<>]*)([[:space:]])/',
' ' . $content .
' ', 10000, PREG_SPLIT_DELIM_CAPTURE);
398 foreach ($parts as $idx => $value) {
404 $elements[$idx] = [];
405 $elements[$idx][
'matchString'] = $value;
406 if (is_array($spParams) && in_array(
'subst', $spParams)) {
407 $parts[$idx] =
'{softref:' . $tokenID .
'}';
408 $elements[$idx][
'subst'] = [
410 'tokenID' => $tokenID,
411 'tokenValue' => $value
417 if (!empty($elements)) {
419 'content' => substr(implode(
'', $parts), 1, -1),
420 'elements' => $elements
435 $parts = preg_split(
'/([^[:alnum:]"\']+)(EXT:[[:alnum:]_]+\\/[^[:space:]"\',]*)/',
' ' . $content .
' ', 10000, PREG_SPLIT_DELIM_CAPTURE);
436 foreach ($parts as $idx => $value) {
439 $elements[$idx] = [];
440 $elements[$idx][
'matchString'] = $value;
444 if (!empty($elements)) {
446 'content' => substr(implode(
'', $parts), 1, -1),
447 'elements' => $elements
473 $finalTagParts = GeneralUtility::makeInstance(TypoLinkCodecService::class)->decode($typolinkValue);
475 $link_param = $finalTagParts[
'url'];
477 unset($finalTagParts[
'url']);
479 if (stripos(rawurldecode(trim($link_param)),
'phar://') === 0) {
480 throw new \RuntimeException(
481 'phar scheme not allowed as soft reference target',
486 $linkService = GeneralUtility::makeInstance(LinkService::class);
488 $linkData = $linkService->resolve($link_param);
489 switch ($linkData[
'type']) {
491 $finalTagParts[
'table'] = $linkData[
'identifier'];
492 $finalTagParts[
'uid'] = $linkData[
'uid'];
495 $linkData[
'pageuid'] = (int)$linkData[
'pageuid'];
496 if (isset($linkData[
'pagetype'])) {
497 $linkData[
'pagetype'] = (int)$linkData[
'pagetype'];
499 if (isset($linkData[
'fragment'])) {
500 $finalTagParts[
'anchor'] = $linkData[
'fragment'];
505 if (isset($linkData[
'file'])) {
507 $linkData[
'file'] = $linkData[
'file'] instanceof
FileInterface ? $linkData[
'file']->getUid() : $linkData[
'file'];
509 $pU = parse_url($link_param);
510 parse_str($pU[
'query'] ??
'', $query);
511 if (isset($query[
'uid'])) {
513 $finalTagParts[
'file'] = (int)$query[
'uid'];
518 return array_merge($finalTagParts, $linkData);
521 return $finalTagParts;
523 return $finalTagParts;
539 $tokenID = $this->
makeTokenID(
'setTypoLinkPartsElement:' . $idx);
540 $elements[$tokenID .
':' . $idx] = [];
541 $elements[$tokenID .
':' . $idx][
'matchString'] = $content;
543 switch ((
string)$tLP[
'type']) {
546 $elements[$tokenID .
':' . $idx][
'subst'] = [
548 'tokenID' => $tokenID,
549 'tokenValue' => $tLP[
'email']
552 $content =
'{softref:' . $tokenID .
'}';
556 $elements[$tokenID .
':' . $idx][
'subst'] = [
557 'type' =>
'external',
558 'tokenID' => $tokenID,
559 'tokenValue' => $tLP[
'url']
562 $content =
'{softref:' . $tokenID .
'}';
566 unset($elements[$tokenID .
':' . $idx]);
570 if (isset($tLP[
'file'])) {
571 $fileId = $tLP[
'file'] instanceof
FileInterface ? $tLP[
'file']->getUid() : $tLP[
'file'];
573 $elements[$tokenID .
':' . $idx][
'subst'] = [
575 'recordRef' =>
'sys_file:' . $fileId,
576 'tokenID' => $tokenID,
577 'tokenValue' =>
'file:' . $fileId,
580 $content =
'{softref:' . $tokenID .
'}';
581 } elseif ($tLP[
'identifier']) {
582 list($linkHandlerKeyword, $linkHandlerValue) = explode(
':', trim($tLP[
'identifier']), 2);
585 $elements[$tokenID .
':' . $idx][
'subst'] = [
587 'recordRef' =>
'sys_file:' . $linkHandlerValue,
588 'tokenID' => $tokenID,
589 'tokenValue' => $tLP[
'identifier'],
592 $content =
'{softref:' . $tokenID .
'}';
605 if ($tLP[
'pageuid']) {
606 $content .=
'{softref:' . $tokenID .
'}';
607 $elements[$tokenID .
':' . $idx][
'subst'] = [
609 'recordRef' =>
'pages:' . $tLP[
'pageuid'],
610 'tokenID' => $tokenID,
611 'tokenValue' => !empty($tLP[
'pagealias']) ? $tLP[
'pagealias'] : $tLP[
'pageuid']
615 if ((
string)($tLP[
'pagetype'] ??
'') !==
'') {
616 $content .=
',' . $tLP[
'pagetype'];
619 if ((
string)($tLP[
'anchor'] ??
'') !==
'') {
623 $newTokenID = $this->
makeTokenID(
'setTypoLinkPartsElement:anchor:' . $idx);
624 $elements[$newTokenID .
':' . $idx] = [];
625 $elements[$newTokenID .
':' . $idx][
'matchString'] =
'Anchor Content Element: ' . $tLP[
'anchor'];
626 $content .=
'#{softref:' . $newTokenID .
'}';
627 $elements[$newTokenID .
':' . $idx][
'subst'] = [
629 'recordRef' =>
'tt_content:' . $tLP[
'anchor'],
630 'tokenID' => $newTokenID,
631 'tokenValue' => $tLP[
'anchor']
635 $content .=
'#' . $tLP[
'anchor'];
640 $elements[$tokenID .
':' . $idx][
'subst'] = [
642 'recordRef' => $tLP[
'table'] .
':' . $tLP[
'uid'],
643 'tokenID' => $tokenID,
644 'tokenValue' => $content,
647 $content =
'{softref:' . $tokenID .
'}';
650 $linkHandlerFound =
false;
651 list($linkHandlerFound, $tLP, $content, $newElements) = $this->
emitSetTypoLinkPartsElement($linkHandlerFound, $tLP, $content, $elements, $idx, $tokenID);
655 if (!$linkHandlerFound) {
656 $elements[$tokenID .
':' . $idx][
'error'] =
'Couldn\'t decide typolink mode.';
661 $tLP[
'url'] = $content;
662 $content = GeneralUtility::makeInstance(TypoLinkCodecService::class)->encode($tLP);
676 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'pages');
677 $queryBuilder->getRestrictions()
679 ->add(GeneralUtility::makeInstance(DeletedRestriction::class))
680 ->add(GeneralUtility::makeInstance(BackendWorkspaceRestriction::class));
682 $pageUid = $queryBuilder->select(
'uid')
685 $queryBuilder->expr()->eq(
'alias', $queryBuilder->createNamedParameter($link_param, \PDO::PARAM_STR))
691 return (
int)$pageUid;
702 return md5($this->tokenID_basePrefix .
':' . $index);
710 return GeneralUtility::makeInstance(\
TYPO3\CMS\
Extbase\SignalSlot\Dispatcher::class);
724 return $this->
getSignalSlotDispatcher()->
dispatch(static::class,
'setTypoLinkPartsElement', [$linkHandlerFound, $tLP, $content, $elements, $idx, $tokenID, $this]);