Нумерация строк

1. Дмитрий (09.06.2011 / 16:33)
вообщем пытаюсь сделать нумерацию строк в подсветке бб кода

<?php
function highlight($code)
{
  $code = highlight_string($code, true);
  $code = '<div class="num">' . implode(range(1, mb_strlen($code, 'UTF8')+1), '<br/>') . '</div>';  
  return $code;
} 
?>
работает не так как надо, в чем дело?

2. KOZZ (09.06.2011 / 16:38)
строка 1 единственная потому что считается smile
как я вижу решение: нужно делить с помощью wordwrap, а затем уже считать количество "\n", и исходя из этого нумеровать

Добавлено через 05:34 сек.
хотя чую анусом что можно сделать это изящнее E

3. KOZZ (09.06.2011 / 17:09)
http://php.su/forum/topic.php?forum=1&topic=3125

4. Валерий (09.06.2011 / 17:10)
ты функцию implode не правильно используешь.. параметры местами поменяй

5. KOZZ (09.06.2011 / 17:16)
тем кодом что автор делает, он просто сделает так:
01234567891011<? echo 'hello world';?>
так не прокатит, логика не верна

6. Дмитрий (09.06.2011 / 17:54)
#4 куда местами менять?
#5 там ничего путнего нет)

7. KOZZ (10.06.2011 / 06:33)
<?php 
function highlight($code) 
{
$count =  mb_strlen($code, 'UTF8');
$ret = '';
$code = explode("\n",highlight_string($code, true));
for($i=0;$i<=$count;$i++){
$ret.= $i /* номер строки */ .') '.$code[$i]."\n" /*сама строка + перенос */;
}  
  return $ret; 
}  
?> 
не тестил, но что-то в таком роде в общем

8. Дмитрий (11.06.2011 / 03:20)
Получилось вот так

0)  1) 
<? 
echo 'Hallo'; 
 2)  3)  4) 5) 6) 7) 8) 9) 10) 11) 12) 13) 14) 15) 16) 17) 18) 19) 20) 21)


9. ramzes (11.06.2011 / 04:04)
<?
        $code = explode(PHP_EOL, $code);
        $ret = '<pre>';
        foreach ($code as $line => $string){
        $ret .= rtrim($string) . '<br>';
        }
        $ret .= '</pre>';
?>
правда у меня это со своим классом подсветки работает, не знаю как поведет себя с highlight_string()

10. Дмитрий (11.06.2011 / 04:16)
рамзес, так тоже не канает, если ретурню $code возвращает Array если $ret возвращает обычный код, без нумерации, но с пробелами

Добавлено через 02:45 сек.
да, и откуда берется $line ? как я понял это будет return $code[$line]; ?

11. ramzes (11.06.2011 / 04:42)
Замени в этом коде <br> на PHP_EOL
line из цикла же берется
будет return $ret;

12. Дмитрий (11.06.2011 / 04:49)
Вот так кое-как работает
<?
function numeric($var)
{

        $var = explode('<br/>', $var); 
        foreach ($var as $line => $string) { 
		$ret .= $line . ' ' . $string . '<br/>'; 
        }

return $ret;

}
?>

строки сбиваются иногда, и то срабатывает только когда вырублю highlight_string()

13. Валерий (11.06.2011 / 12:41)
Как то так. Хотя решение не идеально.. надо сделать чтоб, при копировании кода, номера строк не копировались.
<style type="text/css">
div.code{width:50%;border:solid 1px #cccccc;margin:20px;padding-left:15px;overflow: auto;}
div.code span.nums{margin-right:15px;position:relative;right:0px; color:#000000;background-color:#cccccc;}
</style>
<?php
$str=highlight_file('index.php',true);
$arr=explode("<br />",$str);
$text='';
$i=0;
foreach($arr AS $str)
{
$i++;
$text.='<div><span class="nums">'.$i.'</span>'.$str.'</div>';
}
echo '<div class="code">';
echo $text;
echo '</div>';
?>


14. KOZZ (11.06.2011 / 18:18)
$i=0;
foreach($arr AS $str)
{
$i++;
мб for($i=0;$i<=**;$i++) будет красивее? smile

15. ramzes (11.06.2011 / 18:44)
eGo Свободу Пандам (11 Июня 2011 / 18:18)
мб for($i=0;$i<=**;$i++) будет красивее? smile
неа, меньше действий, меньше кода.
у меня есть класс подсветки, но он не работает с хайлайт стринг (там в ней какие то странности со строками), только с живым текстом, (подсветка css и js)
считает отлично строки, вот из него я и дал метод подсчета

16. Дмитрий (13.06.2011 / 14:53)
valerik (11 Июня 2011 / 12:41)
Как то так. Хотя решение не идеально.. надо сделать чтоб, при копировании кода, номера строк не копировались.
<style type="text/css">
div.code{width:50%;border:solid 1px #cccccc;margin:20px;padding-left:15px;overflow: auto;}
div.code span.nums{margin-right:15px;position:relative;right:0px; color:#000000;background-color:#cccccc;}
</style>
<?php
$str=highlight_file('index.php',true);
$arr=explode("<br />",$str);
$text='';
$i=0;
foreach($arr AS $str)
{
$i++;
$text.='<div><span class="nums">'.$i.'</span>'.$str.'</div>';
}
echo '<div class="code">';
echo $text;
echo '</div>';
?>

то, что номера строк будут копироватся то не беда, но данный пример не подходит, т.к. мне не нужно подсвечивать весь файл, а только тот кусок кода который я выделю в

[i][size=1]Добавлено через 08:04 сек.[/size][/i]
Сделал вот так

[code]
<?
$str = СООБЩЕНИЕ;
$arr=explode("<br/>",$str); 
$text=''; 
$i=0; 
foreach($arr as $str) 
{ 
$i++; 
$text.=''.$i.' '.$str.'<br/>'; 
} 
echo '<div class="code">'; 
echo $text; 
echo '</div>';

выводит вот так

1
2 <?
3 echo 'Hallo';
4 ?>
5 

sad

17. Дмитрий (13.06.2011 / 16:13)
Вот так еще пробовал
$arr = explode("<br/>", $message);
foreach($arr as $num => $message)
{
$text .= $num . ' ' . $message . '<br/>';
}

echo bb_code($text);

выводит вверху ноль, потом начинается подсветка, но номера строк не правильные

18. ramzes (13.06.2011 / 16:53)
ладно не мучайтесьsmile
<?php
//--- Функция подсветки кода ---//

function highlight_code($code){
$code = strtr($code,array('<br />'=>"\r\n",'[br]'=>"\r\n",'<br/>'=>"\r\n",'<'=>'<','>'=>'>','&amp;'=>'&','$'=>'$','"'=>'"','''=>"'",'\'=>'`','%'=>'%','^'=>'^'));
if(!strpos($code,'<?') && substr($code,0,2)!='<?'){
$code="<?php\r\n".trim($code);
}
$code = highlight_string($code,true);
$code = strtr($code,array('<br />'=>"\r\n",'[br]'=>"\r\n",'<br/>'=>"\r\n"));
$code = preg_replace('|(&nbsp;){2,40}|', "\1\r\n", $code);
        $codeline = explode("\r\n", $code);
              foreach ($codeline as $line => $string){
                    if($string!=''){
         $ret.='<span style="color:#666">'.($line+1).'</span> &nbsp; '.trim($string).'<br />';
                    }
              }

$code = strtr($ret, array('$'=>'$',"'"=>''','`'=>'\','%'=>'%','^'=>'^'));

return '<div class="php"><div class="code">'.$code.'</div></div>';
}
?>
http://www.wapblog.in/blogpost/opredelenie-TYC-sayta/ вот что получиться должно

19. Дмитрий (13.06.2011 / 17:34)
Ваш положительный голос за пользователя ramzes успешно оставлен! smile

Добавлено через 05:38 сек.
PS а что а кврадраитики в пробелах у тебя и у меня ?

Добавлено через 09:17 сек.
ага, понял, это из-за \1

20. ramzes (13.06.2011 / 17:44)
Какие квадратики?

21. ramzes (13.06.2011 / 17:58)
19. Mr-General, \1 это пробелы.
у меня ни каких квадратиков нет, походу у тебя что то со шрифтом..

22. Дмитрий (13.06.2011 / 18:02)
Вот скрин, http://upwap.ru/1550370 строки 3я 5я 8я 10я и тд , у меня тоже были, я убрал \1 оставил только \n\r и нету их

23. ramzes (13.06.2011 / 18:12)
22. Mr-General, у тебя шрифт косячный, смени его попробуй, должно помочь.
ты убрал пробелы которыми отступы делаются &nbsp;
\\ поправочка, проглатывал отступы, разваливалось форматирование строк
$code = preg_replace('|(&nbsp;{2,})|', "\r\n\1", $code);
вот так правильнее

24. Дмитрий (13.06.2011 / 18:23)
ок сыпысы smile #теперь close#

URL: https://visavi.net/topics/22265