00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00097 require_once(PATH_t3lib.'class.t3lib_parsehtml.php');
00098
00116 class t3lib_softrefproc {
00117
00118
00119 var $fileAdminDir = 'fileadmin';
00120
00121
00122
00123 var $tokenID_basePrefix = '';
00124
00137 function findRef($table, $field, $uid, $content, $spKey, $spParams, $structurePath='') {
00138
00139 $retVal = FALSE;
00140
00141 $this->tokenID_basePrefix = $table.':'.$uid.':'.$field.':'.$structurePath.':'.$spKey;
00142
00143 switch($spKey) {
00144 case 'notify':
00145 $resultArray = array(
00146 'elements' => array(
00147 array(
00148 'matchString' => $content
00149 )
00150 )
00151 );
00152 $retVal = $resultArray;
00153 break;
00154 case 'substitute':
00155 $tokenID = $this->makeTokenID();
00156 $resultArray = array(
00157 'content' => '{softref:'.$tokenID.'}',
00158 'elements' => array(
00159 array(
00160 'matchString' => $content,
00161 'subst' => array(
00162 'type' => 'string',
00163 'tokenID' => $tokenID,
00164 'tokenValue' => $content
00165 )
00166 )
00167 )
00168 );
00169 $retVal = $resultArray;
00170 break;
00171 case 'images':
00172 $retVal = $this->findRef_images($content, $spParams);
00173 break;
00174 case 'typolink':
00175 $retVal = $this->findRef_typolink($content, $spParams);
00176 break;
00177 case 'typolink_tag':
00178 $retVal = $this->findRef_typolink_tag($content, $spParams);
00179 break;
00180 case 'ext_fileref':
00181 $retVal = $this->findRef_extension_fileref($content, $spParams);
00182 break;
00183 case 'TStemplate':
00184 $retVal = $this->findRef_TStemplate($content, $spParams);
00185 break;
00186 case 'TSconfig':
00187 $retVal = $this->findRef_TSconfig($content, $spParams);
00188 break;
00189 case 'email':
00190 $retVal = $this->findRef_email($content, $spParams);
00191 break;
00192 case 'url':
00193 $retVal = $this->findRef_url($content, $spParams);
00194 break;
00195 default:
00196 $retVal = FALSE;
00197 break;
00198 }
00199
00200 return $retVal;
00201 }
00202
00213 function findRef_images($content, $spParams) {
00214
00215
00216 $htmlParser = t3lib_div::makeInstance('t3lib_parsehtml');
00217 $splitContent = $htmlParser->splitTags('img',$content);
00218 $elements = array();
00219
00220
00221 foreach($splitContent as $k => $v) {
00222 if ($k%2) {
00223
00224
00225 $attribs = $htmlParser->get_tag_attributes($v);
00226 $srcRef = t3lib_div::htmlspecialchars_decode($attribs[0]['src']);
00227 $pI = pathinfo($srcRef);
00228
00229
00230 $absPath = t3lib_div::getFileAbsFileName(PATH_site.$srcRef);
00231 if (!$pI['scheme'] && !$pI['query'] && $absPath && $srcRef!=='clear.gif') {
00232
00233
00234 $tokenID = $this->makeTokenID($k);
00235 $elements[$k] = array();
00236 $elements[$k]['matchString'] = $v;
00237
00238
00239 if (t3lib_div::isFirstPartOfStr($srcRef,$this->fileAdminDir.'/') || (t3lib_div::isFirstPartOfStr($srcRef,'uploads/') && ereg('^RTEmagicC_',basename($srcRef)))) {
00240
00241 if (strstr($splitContent[$k], $attribs[0]['src'])) {
00242 $splitContent[$k] = str_replace($attribs[0]['src'], '{softref:'.$tokenID.'}', $splitContent[$k]);
00243 $elements[$k]['subst'] = array(
00244 'type' => 'file',
00245 'relFileName' => $srcRef,
00246 'tokenID' => $tokenID,
00247 'tokenValue' => $attribs[0]['src'],
00248 );
00249 if (!@is_file($absPath)) {
00250 $elements[$k]['error'] = 'File does not exist!';
00251 }
00252 } else {
00253 $elements[$k]['error'] = 'Could not substitute image source with token!';
00254 }
00255 }
00256 }
00257 }
00258 }
00259
00260
00261 if (count($elements)) {
00262 $resultArray = array(
00263 'content' => implode('', $splitContent),
00264 'elements' => $elements
00265 );
00266
00267 return $resultArray;
00268 }
00269 }
00270
00280 function findRef_typolink($content, $spParams) {
00281
00282
00283
00284 if (is_array($spParams) && in_array('linkList',$spParams)) {
00285 $linkElement = explode(',', $content);
00286 } else {
00287 $linkElement = array($content);
00288 }
00289
00290
00291 $elements = array();
00292 foreach($linkElement as $k => $typolinkValue) {
00293 $tLP = $this->getTypoLinkParts($typolinkValue);
00294 $linkElement[$k] = $this->setTypoLinkPartsElement($tLP, $elements, $typolinkValue, $k);
00295 }
00296
00297
00298 if (count($elements)) {
00299 $resultArray = array(
00300 'content' => implode(',', $linkElement),
00301 'elements' => $elements
00302 );
00303
00304 return $resultArray;
00305 }
00306 }
00307
00317 function findRef_typolink_tag($content, $spParams) {
00318
00319
00320 $htmlParser = t3lib_div::makeInstance('t3lib_parsehtml');
00321 $linkTags = $htmlParser->splitTags('link',$content);
00322
00323
00324 $elements = array();
00325 foreach($linkTags as $k => $foundValue) {
00326 if ($k%2) {
00327 $typolinkValue = eregi_replace('<LINK[[:space:]]+','',substr($foundValue,0,-1));
00328 $tLP = $this->getTypoLinkParts($typolinkValue);
00329 $linkTags[$k] = '<LINK '.$this->setTypoLinkPartsElement($tLP, $elements, $typolinkValue, $k).'>';
00330 }
00331 }
00332
00333
00334 if (count($elements)) {
00335 $resultArray = array(
00336 'content' => implode('', $linkTags),
00337 'elements' => $elements
00338 );
00339
00340 return $resultArray;
00341 }
00342 }
00343
00352 function findRef_TStemplate($content, $spParams) {
00353 $elements = array();
00354
00355
00356 $htmlParser = t3lib_div::makeInstance('t3lib_parsehtml');
00357 $splitContent = $htmlParser->splitTags('img,a,form', $content);
00358
00359
00360 foreach($splitContent as $k => $v) {
00361 if ($k%2) {
00362
00363 $attribs = $htmlParser->get_tag_attributes($v);
00364
00365 $attributeName = '';
00366 switch($htmlParser->getFirstTagName($v)) {
00367 case 'img':
00368 $attributeName = 'src';
00369 break;
00370 case 'a':
00371 $attributeName = 'href';
00372 break;
00373 case 'form':
00374 $attributeName = 'action';
00375 break;
00376 }
00377
00378
00379 if (isset($attribs[0][$attributeName])) {
00380 $srcRef = t3lib_div::htmlspecialchars_decode($attribs[0][$attributeName]);
00381
00382
00383 $tokenID = $this->makeTokenID($k);
00384 $elements[$k] = array();
00385 $elements[$k]['matchString'] = $v;
00386
00387
00388 $pI = pathinfo($srcRef);
00389 $absPath = t3lib_div::getFileAbsFileName(PATH_site.$srcRef);
00390 if (t3lib_div::isFirstPartOfStr($srcRef,$this->fileAdminDir.'/') && !$pI['query'] && $absPath) {
00391
00392
00393 if (strstr($splitContent[$k], $attribs[0][$attributeName])) {
00394 $splitContent[$k] = str_replace($attribs[0][$attributeName], '{softref:'.$tokenID.'}', $splitContent[$k]);
00395 $elements[$k]['subst'] = array(
00396 'type' => 'file',
00397 'relFileName' => $srcRef,
00398 'tokenID' => $tokenID,
00399 'tokenValue' => $attribs[0][$attributeName],
00400 );
00401 if (!@is_file($absPath)) {
00402 $elements[$k]['error'] = 'File does not exist!';
00403 }
00404 } else {
00405 $elements[$k]['error'] = 'Could not substitute attribute ('.$attributeName.') value with token!';
00406 }
00407 }
00408 }
00409 }
00410 }
00411 $content = implode('', $splitContent);
00412
00413
00414 $content = $this->fileadminReferences($content, $elements);
00415
00416
00417 if (count($elements)) {
00418 $resultArray = array(
00419 'content' => $content,
00420 'elements' => $elements
00421 );
00422 return $resultArray;
00423 }
00424 }
00425
00434 function findRef_TSconfig($content, $spParams) {
00435 $elements = array();
00436
00437
00438 $content = $this->fileadminReferences($content, $elements);
00439
00440
00441 if (count($elements)) {
00442 $resultArray = array(
00443 'content' => $content,
00444 'elements' => $elements
00445 );
00446 return $resultArray;
00447 }
00448 }
00449
00457 function findRef_email($content, $spParams) {
00458 $resultArray = array();
00459
00460
00461 $parts = preg_split("/([^[:alnum:]]+)([A-Za-z0-9\._-]+[@][A-Za-z0-9\._-]+[\.].[A-Za-z0-9]+)/", ' '.$content.' ',10000, PREG_SPLIT_DELIM_CAPTURE);
00462 foreach($parts as $idx => $value) {
00463 if ($idx%3 == 2) {
00464
00465 $tokenID = $this->makeTokenID($idx);
00466 $elements[$idx] = array();
00467 $elements[$idx]['matchString'] = $value;
00468
00469 if (is_array($spParams) && in_array('subst',$spParams)) {
00470 $parts[$idx] = '{softref:'.$tokenID.'}';
00471 $elements[$idx]['subst'] = array(
00472 'type' => 'string',
00473 'tokenID' => $tokenID,
00474 'tokenValue' => $value,
00475 );
00476 }
00477 }
00478 }
00479
00480
00481 if (count($elements)) {
00482 $resultArray = array(
00483 'content' => substr(implode('',$parts),1,-1),
00484 'elements' => $elements
00485 );
00486 return $resultArray;
00487 }
00488 }
00489
00497 function findRef_url($content, $spParams) {
00498 $resultArray = array();
00499
00500
00501 $parts = preg_split("/([^[:alnum:]\"']+)((http|ftp):\/\/[^[:space:]\"'<>]*)([[:space:]])/", ' '.$content.' ',10000, PREG_SPLIT_DELIM_CAPTURE);
00502
00503 foreach($parts as $idx => $value) {
00504 if ($idx%5 == 3) { unset($parts[$idx]); }
00505 if ($idx%5 == 2) {
00506
00507 $tokenID = $this->makeTokenID($idx);
00508 $elements[$idx] = array();
00509 $elements[$idx]['matchString'] = $value;
00510
00511 if (is_array($spParams) && in_array('subst',$spParams)) {
00512 $parts[$idx] = '{softref:'.$tokenID.'}';
00513 $elements[$idx]['subst'] = array(
00514 'type' => 'string',
00515 'tokenID' => $tokenID,
00516 'tokenValue' => $value,
00517 );
00518 }
00519 }
00520 }
00521
00522
00523 if (count($elements)) {
00524 $resultArray = array(
00525 'content' => substr(implode('',$parts),1,-1),
00526 'elements' => $elements
00527 );
00528 return $resultArray;
00529 }
00530 }
00531
00539 function findRef_extension_fileref($content, $spParams) {
00540 $resultArray = array();
00541
00542
00543 $parts = preg_split("/([^[:alnum:]\"']+)(EXT:[[:alnum:]_]+\/[^[:space:]\"',]*)/", ' '.$content.' ',10000, PREG_SPLIT_DELIM_CAPTURE);
00544
00545 foreach($parts as $idx => $value) {
00546 if ($idx%3 == 2) {
00547
00548 $tokenID = $this->makeTokenID($idx);
00549 $elements[$idx] = array();
00550 $elements[$idx]['matchString'] = $value;
00551 }
00552 }
00553
00554
00555 if (count($elements)) {
00556 $resultArray = array(
00557 'content' => substr(implode('',$parts),1,-1),
00558 'elements' => $elements
00559 );
00560 return $resultArray;
00561 }
00562 }
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00591 function fileadminReferences($content, &$elements) {
00592
00593
00594 $parts = preg_split("/([^[:alnum:]]+)(".$this->fileAdminDir."\/[^[:space:]\"'<>]*)/", ' '.$content.' ',10000, PREG_SPLIT_DELIM_CAPTURE);
00595
00596
00597 foreach($parts as $idx => $value) {
00598 if ($idx%3 == 2) {
00599
00600
00601 $tokenID = $this->makeTokenID('fileadminReferences:'.$idx);
00602 $elements['fileadminReferences.'.$idx] = array();
00603 $elements['fileadminReferences.'.$idx]['matchString'] = $value;
00604 $elements['fileadminReferences.'.$idx]['subst'] = array(
00605 'type' => 'file',
00606 'relFileName' => $value,
00607 'tokenID' => $tokenID,
00608 'tokenValue' => $value,
00609 );
00610 $parts[$idx] = '{softref:'.$tokenID.'}';
00611
00612
00613 $absPath = t3lib_div::getFileAbsFileName(PATH_site.$value);
00614 if (!@is_file($absPath)) {
00615 $elements['fileadminReferences.'.$idx]['error'] = 'File does not exist!';
00616 }
00617 }
00618 }
00619 #debug($parts);
00620
00621 return substr(implode('',$parts),1,-1);
00622 }
00623
00634 function getTypoLinkParts($typolinkValue) {
00635 $finalTagParts = array();
00636
00637
00638 list($link_param, $browserTarget, $cssClass) = t3lib_div::trimExplode(' ',$typolinkValue,1);
00639 if (strlen($browserTarget)) $finalTagParts['target'] = $browserTarget;
00640 if (strlen($cssClass)) $finalTagParts['class'] = $cssClass;
00641
00642
00643 $pU = parse_url($link_param);
00644
00645
00646 if(strstr($link_param,'@') && !$pU['scheme']) {
00647 $link_param = eregi_replace('^mailto:','',$link_param);
00648
00649 $finalTagParts['LINK_TYPE'] = 'mailto';
00650 $finalTagParts['url'] = trim($link_param);
00651 } else {
00652 $isLocalFile = 0;
00653 $fileChar = intval(strpos($link_param, '/'));
00654 $urlChar = intval(strpos($link_param, '.'));
00655
00656
00657 list($rootFileDat) = explode('?',rawurldecode($link_param));
00658 $containsSlash = strstr($rootFileDat,'/');
00659 $rFD_fI = pathinfo($rootFileDat);
00660 if (trim($rootFileDat) && !$containsSlash && (@is_file(PATH_site.$rootFileDat) || t3lib_div::inList('php,html,htm',strtolower($rFD_fI['extension'])))) {
00661 $isLocalFile = 1;
00662 } elseif ($containsSlash) {
00663 $isLocalFile = 2;
00664 }
00665
00666 if($pU['scheme'] || ($isLocalFile!=1 && $urlChar && (!$containsSlash || $urlChar<$fileChar))) {
00667 $finalTagParts['LINK_TYPE'] = 'url';
00668 $finalTagParts['url'] = $link_param;
00669 } elseif ($containsSlash || $isLocalFile) {
00670 $splitLinkParam = explode('?', $link_param);
00671 if (@file_exists(rawurldecode($splitLinkParam[0])) || $isLocalFile) {
00672 $finalTagParts['LINK_TYPE'] = 'file';
00673 $finalTagParts['filepath'] = rawurldecode($splitLinkParam[0]);
00674 $finalTagParts['query'] = $splitLinkParam[1];
00675 }
00676 } else {
00677 $finalTagParts['LINK_TYPE'] = 'page';
00678
00679 $link_params_parts = explode('#',$link_param);
00680 $link_param = trim($link_params_parts[0]);
00681
00682 if (strlen($link_params_parts[1])) {
00683 $finalTagParts['anchor'] = trim($link_params_parts[1]);
00684 }
00685
00686
00687 $pairParts = t3lib_div::trimExplode(',',$link_param);
00688 if (count($pairParts)>1) {
00689 $link_param = $pairParts[0];
00690 $finalTagParts['type'] = $pairParts[1];
00691 }
00692
00693
00694 if (strlen($link_param)) {
00695 if (!t3lib_div::testInt($link_param)) {
00696 $finalTagParts['alias'] = $link_param;
00697 $link_param = $this->getPageIdFromAlias($link_param);
00698 }
00699
00700 $finalTagParts['page_id'] = intval($link_param);
00701 }
00702 }
00703 }
00704
00705 return $finalTagParts;
00706 }
00707
00718 function setTypoLinkPartsElement($tLP, &$elements, $content, $idx) {
00719
00720
00721 $tokenID = $this->makeTokenID('setTypoLinkPartsElement:'.$idx);
00722 $elements[$tokenID.':'.$idx] = array();
00723 $elements[$tokenID.':'.$idx]['matchString'] = $content;
00724
00725
00726 switch ((string)$tLP['LINK_TYPE']) {
00727 case 'mailto':
00728
00729 $elements[$tokenID.':'.$idx]['subst'] = array(
00730 'type' => 'string',
00731 'tokenID' => $tokenID,
00732 'tokenValue' => $tLP['url'],
00733 );
00734
00735 $content = '{softref:'.$tokenID.'}';
00736 break;
00737 case 'url':
00738
00739 {
00740 return $content;
00741 }
00742 break;
00743 case 'file':
00744
00745 if (!$tLP['query']) {
00746 if (t3lib_div::isFirstPartOfStr($tLP['filepath'],$this->fileAdminDir.'/')) {
00747
00748
00749 $elements[$tokenID.':'.$idx]['subst'] = array(
00750 'type' => 'file',
00751 'relFileName' => $tLP['filepath'],
00752 'tokenID' => $tokenID,
00753 'tokenValue' => $tLP['filepath'],
00754 );
00755
00756
00757 $absPath = t3lib_div::getFileAbsFileName(PATH_site.$tLP['filepath']);
00758 if (!@is_file($absPath)) {
00759 $elements[$tokenID.':'.$idx]['error'] = 'File does not exist!';
00760 }
00761
00762
00763 $content = '{softref:'.$tokenID.'}';
00764 } else return $content;
00765 } else return $content;
00766 break;
00767 case 'page':
00768
00769 $content = '';
00770
00771
00772 if ($tLP['page_id']) {
00773 $content.= '{softref:'.$tokenID.'}';
00774 $elements[$tokenID.':'.$idx]['subst'] = array(
00775 'type' => 'db',
00776 'recordRef' => 'pages:'.$tLP['page_id'],
00777 'tokenID' => $tokenID,
00778 'tokenValue' => $tLP['alias'] ? $tLP['alias'] : $tLP['page_id'],
00779 );
00780 }
00781
00782
00783 if (strlen($tLP['type'])) {
00784 $content.= ','.$tLP['type'];
00785 }
00786
00787
00788 if (strlen($tLP['anchor'])) {
00789 if (t3lib_div::testInt($tLP['anchor'])) {
00790
00791 $newTokenID = $this->makeTokenID('setTypoLinkPartsElement:anchor:'.$idx);
00792 $elements[$newTokenID.':'.$idx] = array();
00793 $elements[$newTokenID.':'.$idx]['matchString'] = 'Anchor Content Element: '.$tLP['anchor'];
00794
00795 $content.= '#{softref:'.$newTokenID.'}';
00796 $elements[$newTokenID.':'.$idx]['subst'] = array(
00797 'type' => 'db',
00798 'recordRef' => 'tt_content:'.$tLP['anchor'],
00799 'tokenID' => $newTokenID,
00800 'tokenValue' => $tLP['anchor'],
00801 );
00802 } else {
00803 $content.= '#'.$tLP['type'];
00804 }
00805 }
00806 break;
00807 default:
00808 {
00809 $elements[$tokenID.':'.$idx]['error'] = 'Couldn\t decide typolink mode.';
00810 return $content;
00811 }
00812 break;
00813 }
00814
00815
00816 if (strlen($content) && strlen($tLP['target'])) {
00817 $content.= ' '.$tLP['target'];
00818 if (strlen($tLP['class'])) {
00819 $content.= ' '.$tLP['class'];
00820 }
00821 }
00822
00823
00824 return $content;
00825 }
00826
00833 function getPageIdFromAlias($link_param) {
00834 $pRec = t3lib_BEfunc::getRecordsByField('pages','alias',$link_param);
00835
00836 return $pRec[0]['uid'];
00837 }
00838
00845 function makeTokenID($index='') {
00846 return md5($this->tokenID_basePrefix.':'.$index);
00847 }
00848 }
00849
00850 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_softrefproc.php']) {
00851 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_softrefproc.php']);
00852 }
00853 ?>