من اینطور فهمیدم که هر جای صفحه بخواهیم کدهامون بصورت هایلایت شده قرار بگیرن، باید به روش زیر عمل کنیم( در فریمورک این کد رو در view باید قرار بدیم):
php $abstract= $post->abstract; ?>
require_once 'luminous/luminous.php';
set_time_limit(3);
$use_cache = !isset($_GET['nocache']);
echo luminous::head_html();
echo luminous::highlight('php', $abstract, array('cache' => $use_cache));
حالا تگهای code و pre رو چطور از بقیه متن جدا کنم و برای تابع highligh بفرستم؟
میتونید با کمی تلاش، لومینوس رو تبدیل به کامپوننت کنید. طبق آموزش تبدیل JDF به کامپوننت عمل کنید تا نخواین هر دفعه require کنید. میشه درنهایت متدی به کامپوننت اضافه کنید که یه متن رو میگیره و تگهای موردنظر رو با RegExp پیدا و تبدیل میکنه. توی Layout هم کافیه بجای نمایش مستقیم content$، این متغیر رو به اون متد بفرستین و خروجی اون رو نمایش بدین.
یه RegExp بصورت زیر نوشتم که تگ pre یا code رو همراه با متن بینشون پیدا میکنه. مشکلش اینه اگه توی رشته ای بیش از یک تگ pre داشته باشیم، کل متن بین تگ شروع pre اول و پایان تگ pre دوم رو درمیاره.
چطوری دو یا چند تگ pre رو از هم جدا کنم؟
$str = '123456 <pre> echo "red"; </pre> 78945 <pre> echo "blue"; </pre> 147852';
$check = preg_match('/(<pre>|<code>)(.*)(</pre>|</code>)/sm', $str,$match);
خروجی:
array
(
0 => '<pre> echo "red"; </pre> 78945 <pre> echo "blue"; </pre>'
1 => '<pre>'
2 => ' echo "red"; </pre> 78945 <pre> echo "blue"; '
3 => '</pre>'
)
توی اینترنت درمورد Detect nested tags with RegExp in PHP تحقیق کنید.
برای شناسوندن زبان php به luminous، تغییرات خاصی لازمه؟
نه کار خاصی لازم نداره. فقط کافیه بهش بگین که کدتون PHP تا هایلایت کنه. مثال:
require_once 'luminuos/luminous.php';
echo luminous::highlight('php', '<?php
date_default_timezone_set('Asia/Tehran');
echo date('H:i:s') . '<br />' . PHP_EOL;
?>');
در اصل Luminous با خود PHP نوشته شده و اولین زبانی که پشتیبانی کرده، PHP بوده.
باید متن مورد نظرو داخل تگ php قرار بدیم تا هایلایت زبان php به متن اعمال بشه:
luminous::highlight('php', '<?php '.$value.' ?>');
خوب خدا رو شکر. این Luminous با اینکه چند ساله بروزرسانی نشده ولی واقعاً خیلی خوبه. قالبهای خیلی جالبی هم داره.
مراحل دانلود و نصب luminous:
ابتدا از این
لینک دانلودش میکنیم.
بعد لینکها و اسکریپتهاشو معرفی میکنیم. برای این کار لینکها و اسکریپتها رو در تگ head صفحمون بصورت زیر قرار میدیم:
<script type='text/javascript' src='<?php echo Yii::app()->homeUrl; ?>luminous/client/jquery-1.6.4.min.js'></script>
<script type='text/javascript' src='<?php echo Yii::app()->homeUrl; ?>luminous/assets/script/jquery.jknotify.min.js'></script>
<script type='text/javascript' src='<?php echo Yii::app()->homeUrl; ?>luminous/assets/script/jquery.jknotifyui.min.js'></script>
<script type='text/javascript' src='<?php echo Yii::app()->homeUrl; ?>luminous/assets/script/visuals.js'></script>
<script type='text/javascript' src='<?php echo Yii::app()->homeUrl; ?>luminous/assets/script/luminous.js'></script>
<link rel='stylesheet' type='text/css' href='<?php echo Yii::app()->homeUrl; ?>luminous/style/luminous.css' id='luminous-style'>
<link rel='stylesheet' type='text/css' href='<?php echo Yii::app()->homeUrl; ?>luminous/style/luminous_light.css' id='luminous-theme'>
<link rel='stylesheet' type='text/css' href='<?php echo Yii::app()->homeUrl; ?>luminous/assets/style/buttons.css'>
بعد luminous.php رو هر جای صفحه بخواهیم متنی هایلایت بشه require میکنیم:
require_once 'luminous/luminous.php';
set_time_limit(3);
$use_cache = !isset($_GET['nocache']);
echo luminous::head_html();
حالا طبق روش پست 22 این تاپیک، متن دلخواهمونو هایلایت میزنیم.
دو متد زیر تگهای pre و code رو از متن جداسازی نموده و هایلایت میزنند. این متدها را در components/Controller.php قرار دادم:
/**
*
* @param type $tagName نام تگ که باید از متن جدا شود
* @param type $str متنی که تگ از آن جدا میشود
* @return type یک آرایه که تگهای جدا شده را برمیگرداند
*/
public function parseTag($tagName, $str){
$dom = new DOMDocument();
$dom->loadHTML($str);
$tagItems= $dom->getElementsByTagName($tagName);
$tagItemNode=array();
$tagItemNodes= array();
foreach($tagItems as $tagItem) {
if($tagItem->childNodes->length) {
foreach($tagItem->childNodes as $i) {
$tagItemNode[$i->nodeName] = $i->nodeValue;
}
}
$tagItemNodes[] = $tagItemNode;
}
return $tagItemNodes;
}
/**
*
* @param type $str رشته ای که باید تگهایش جداسازی شده و هایلایت شوند
*/
public function luminous($str) {
$tag= array('pre', 'code');
$count= count($tag);
$highlightTags= array();
for($i=0;$i<$count;$i++){
$highlightTags[$i]= $this->parseTag($tag[$i], $str);
}
require_once 'luminous/luminous.php';
set_time_limit(3);
$use_cache = !isset($_GET['nocache']);
echo luminous::head_html();
if($count=count($highlightTags)>0){
$i=0;
foreach($highlightTags as $highlightTag){
foreach ($highlightTag as $tag) {
foreach ($tag as $value) {
$newval= luminous::highlight('php', '<?php '.PHP_EOL.$value.'?>', array('cache' => $use_cache));
if($newval){
$str= str_replace($value, $newval, $str);
}
}
}
}
}
echo $str;
}
بعد در view با دستوری زیر فراخوانی میشن:
$this->luminous($post->abstract);