Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kolorowanie składni PHP na forum
Forum PHP.pl > Inne > Opinie, ogłoszenia, pytania > Forum
Stron: 1, 2
dragossani
Do znaczników BBCode został dodany nowy element - znacznik php (pierwszy z prawej). Odpowiada za wstawianie bloków kodu php, obsługuje kolorowanie składni. Mam nadzieję, że wszyscy łatwo się do niego przyzwyczają. Bloki innego kodu (np. SQL) należy umieszczać w dotychczas stosowanym znaczniku CODE.

Mam nadzieję, że mechanizm będzie pracował stabilnie.

Dzięki dla DeyV'a za przypomnienie sprawy.
itsme
[php:1:c896f5b579]<?php
echo "proba - pieknie to wyglada";
?>[/php:1:c896f5b579]
gratuluje pomyslu
DeyV
Świetnie, że do tego doszło...
Mam tylko takie pytanie. Czy jest sens dodawania osobnego znacznika? Gdyby pozostać tylko przy [code] mielibyśmy wgląd również w starsze wpisy. A przecież i tak fragmeny kodu nie zawarte pommiędzy <? ?> są wyświetlane jako zwykły tekst, dla którego mozna ustawwić dowolny kolor, również ten aktualny dla code, czyli zielony.
dragossani
Dodałem nowy znacznik bo nie chcę wszystkich rodzajów kodu wrzucać do jednego wora. Docelowo chciałbym rodzielić większość używanych rodzajów kodu i kolorować odpowiednio każdy z nich. Na razie jest php bo to kolorowanie zapewnia sam silnik php. Jak będę dysponował nadmiarem czasu, pomęczę się nad następnymi (SQL, XHTML, XML, CSS2). Oczywiście jeśli ktoś ma już coś takiego zrobione u siebie to proszę o kontakt.
DeyV
Trochę mineło już czasu od uruchomienia tego systemu :oops: . A ja dopiero teraz upewniłem sie, że funkcja odpowiedzialna za wyświetlanie kodu php ma pewien błąd.
Orginalnie znacznik Code ma dodaną funcję, zabezpieczającą przed rozciąganiem strony przez zbyt długie linie.
Brakuje jej jednak przy użyciu znacznika php.

dragossani - to była mała sugestia do Ciebie smile.gif
KaMeLeOn
Jeszcze wstawia dodatkowy <br/> na górze i na dole tabeli co rozciąga ją także w pionie...
Sprawdzałem kolorowanie składni w php - tam jest OK...
DeyV
A jeśli administratorowi brak czasu na dokonanie niezbędnych poprawek - proponuję rzucić temat na forum - na pewno znajdzie się jakiś znudzony forumowicz, który będzie umiał rozwiązać te problemy. 8) laugh.gif aaevil.gif
A oba całkiem mocno dokuczają.
KaMeLeOn
Cytat
A jeśli administratorowi brak czasu na dokonanie niezbędnych poprawek - proponuję żucić temat na forum -  na pewno znajdzie się jakiś znudzony forumowicz, który będzie umiał rozwiązać te problemy.  8)  :lol:  :twisted:  
A oba całkiem mocno dokuczają.

Nie ma problemu, mogę to poprawić...
Ale znudzony nie jestem :wink:
dragossani
KaMeLeOn stanął na wysokości zadania i poprawił co trzeba. Dzięki za pomoc. smile.gif
scanner
Tylko czcionka coś dziwna... Nie można dac Verdany albo czegoś proporcjopnalnego?
KaMeLeOn
Cytat
Tylko czcionka coś dziwna... Nie można dac Verdany albo czegoś proporcjopnalnego?

Dlaczego dziwna?
Wszystko jest wstawione w znaczniki CODE, tak jak oryginalnie wyświetla funkcja show_source()...
DeyV
Może wiec przydałoby się tworzyć styl css, który by go zmieniał? Ta czcionka rzeczywiście jest nieco nieprzyjazna.
scanner
Wydaje mi się, ze poprzednia czcionka była inna... Wiem, że się czepiam, ale lubie proste, czytelne fonty...
Seth
Tez tak uwazam. Lepsza byla by Tahoma lub Verdana.
KaMeLeOn
To jak wy czytacie MANUAL'a ?
Tam wszystkie przykłady są czcionką CODE...
Pogadam z dragossanim... pomyślimy.
Na razie przygotowuję nowy moduł...
DeyV
to prawda że ten font, ale nie ten rozmiar. I wszystko w temacie
KaMeLeOn
Cytat
to prawda że ten font, ale nie ten rozmiar. I wszystko w temacie

Wyobraź sobie co by się działo gdyby font był większy...
spenalzo
Przydałoby się jeszcze zawijanie długich wierszy.
KaMeLeOn
Cytat
Przydałoby się jeszcze zawijanie długich wierszy.

Zawijanie długich wierszy jest... :!:
Zawsze było, ale nie podzielę linii, którą ktoś napisał ciągiem (bez spacji), nie jestem przewidzieć co ludzie piszą i gdzie zapominają spacji, a pisanie takiej funkcji jest nieopłacalne....
To zadanie dla moderatorów.
Panowe moderatorzy wystarczy edytować posta i wstawić " " (SPACE) po przecinku
Zobaczcie tu http://forum.php.pl/viewtopic.php?t=2820 ...
DeyV
NIe mozna by skorzystać z wordwrap() ?
spenalzo
Tylko wtedy trzeba by oznaczyć nową linię, żeby było wiadomo że przeniesione.
KaMeLeOn
Cytat
NIe mozna by skorzystać z wordwrap() ?

I co Ci da wordwrap() jak nie ma spacji?
Przy długich liniach tak potnie wyrazy, że się nie połapiesz...
Niech ludzie uczą się polskiej pisowini i wstawiają po przecinku spacje. aaevil.gif
KaMeLeOn
OK.
Ponieważ mnie też zaczęły wk....ać te rozj..ane strony podjąłem próbę napisania porządnej funkcji...

Przepisałem ją od nowa i tak:
- znaczniki CODE i php łamią wiersz po 80 znakach
- czcionka w CODE i php jest +1 (podoba się wam, czy jest niewyraźna aaevil.gif )

Jeśli zauważycie jakieś rozciągnięcia lub źle wyświetlane htmlspecialchars, piszcie do mnie...
DeyV
To ja powiem tylko tak: Niech się Pan częściej tak wku.. znaczy denerwuje.
Jest świetnie biggrin.gif
scanner
Kameleon: great work smile.gif)
Cudi
Kolorowanie jest bardzo fajne, ale ja mam jeszcze jedną małą sugestie. Czasem bywa tak że piszemy kawałek kodu, tłumaczymy co i jak, i dajemy potem znowu kawałek kodu. Wtedy przydałoby sie aby kod między znacznikami {php} i {/php} ({ = [ ) był kolorowany nawet wtedy, gdy nie jest on zawarty między <?php i ?>. Na tej stronie widać dokładniej o co mi chodzi:
:arrow: http://cudi.website.pl/testy/color_code.php

Co o tym myślicie ?
Wankster
Cudi: Ciekawe, jestem za!
KaMeLeOn
Cytat
Cudi: Ciekawe, jestem za!

A ja nie...
Według mnie rozdzielanie kodu tworzy niepotrzebny zamęt...
scanner
wole tak:
[php:1:60a0704970]<?php
/*
komentujemy
komentujemu
*/
echo $x;
// komentujemy
echo $y;
?>[/php:1:60a0704970]
Cudi
No jak chcecie, ja tylko zgłosiłem swoją propozycję smile.gif Mnie wydaje sie że znaczniki <?php i ?> są czasem zbędne podczas pisania jakiegoś fragmentu kodu php...
KaMeLeOn
A co myślicie o numerowaniu wierszy, np.
Cytat
[1] <?php
[2] // jakiś kod
[3] // ...
[4] ?>
scanner
Tak, ale tylko jesli wierszy wiecej niz 4, 5..
Seth
Ja jestem przeciwny, a to z prostego powodu: jak ktos chce skopjowac z forum kod i wkleic go u siebie to potem musi usuwac wszystkie liczby na poczatku wiersza.
DeyV
Przy czym jest to bardzo dobry pomysł - ale inaczej wykonany.
Bardzo ułatwiałoby życie, a zarazem nie utrudnialo kopiowania kodu takie rozwiązanie.
Seth
Teraz jestem za smile.gif
KaMeLeOn
Podoba mi się ten pomysł...
Ja wcale nie mówiłem, że ma być tak jak ja pokazałem.
Chodziło mi o samą ideę...
Seth
TYlko mozna bylo by dac nr-y linijek na inny kolor np: czarny czy ciemny szary.
DeyV
KaMeLeOn - zrobisz to, jak zwykle winksmiley.jpg , samodzielnie, czy też podrzuciłbyś na forum aktualny kod odopwiedzialny za kolorowanie? (Ciekawy jestem, jak uporałeś sie z problemem zawijania wierszy...)
Cudi
Ja też chętnie rzuciłbym okiem na ten kod, ciekawi mnie czy korzystacie z wyrażeń regularnych czy może z operacji na tablicach (dzielicie posta explodem i kolorujecie co trzeba).
DeyV
Nie przesadzaj, cudi, aż tak pracowity to nie jest nawet Kameleon tongue.gif
Od tego jest highlight_file()
Seth
Kamelon: Cos chyba wyparowal poprzedni kod (chyba wiesz o co mi chozi winksmiley.jpg)
Cudi
Cytat
Nie przesadzaj, cudi, aż tak pracowity to nie jest nawet Kameleon tongue.gif
Od tego jest highlight_file()


Chodzi mi o to jak oddziela kod do pokolorowania od reszty postu! I nie highlight_file tylko highlight_string.
KaMeLeOn
Cytat
Kamelon: Cos chyba wyparowal poprzedni kod (chyba wiesz o co mi chozi winksmiley.jpg)

biggrin.gif Wiem, zauważyłem wczoraj mały błąd i musiałem go poprawić...

No więc tak....
To fakt, że php ma wbudowaną funkcję kolorowania składni, ale jest ona szczerze mówiąc jeszcze niedopracowana... Trzeba pod nią dokładnie przygotować grunt i po wykorzystaniu poprawić wiele błędów.
Np. Funckje highlight_*() nie biorą pod uwagę znaków htmlspecialchars()...
Tzn. traktują osobno & i nbsp; oraz mnoza nieskonczenie spacje, przy wykorzystaniu TAB. To prowadzi np. właśnie do rozciągania tabel.
Długo się zastanawiałem jak pozamieniać błędy za jednym zamachem, ale niestety nie ma takiej możliwosci. Trzeba stosować zamianę znaków po skończeniu poprzedniej...
Zawijanie wierszy jest dosyć proste. Zastosowałem zawijanie tylko w przypadku dlugiego wiersza, który nie zawiera żadnej spacji. Reszta jest sterowana przerwami między wyrażeniami lub po przecinkach.

Już wczoraj podałem kod tej funkcji, ale jak zauważył Seth usunąłem posta. Dlaczego?
Przeglądnijcie kod tej funkcji, a zauważycie, że w funkcjach str_replace() jest tylko "&".
Oczywiście powinny być & nbsp; (bez spacji) i & amp; (bez spacji).
Myślałem, że to wina mojej funkcji, ale nie :wink:
phpBB obcina takie znaki podczas dodawania posta, co oczywiście jest następną rzeczą do poprawy...
Wogóle to phpBB zawiera kupę błędów, które oczywiście mam zamiar poprawić. biggrin.gif
Nawet nie wyobrażacie sobie ile kopii zmiennych i tablic tworzy silnik forum podczas generowania stron... Dlatego m.in. dodałem referencje w argumentach funkcji...

To spłodziłem:
[php:1:9dd391a294]<?php
/**
* Does second-pass bbencoding of the php tags. This includes
* running htmlspecialchars() over the text contained between
* any pair of php tags that are at the first level of
* nesting. Tags at the first level of nesting are indicated
* by this format: [php:1:$uid] ... [/php:1:$uid]
* Other tags are in this format: [php:$uid] ... [/php:$uid]
*
* Original code/function by phpBB Group
* Modified by KaMeLeOn <kameleon@php.pl>
*/

function bbencode_second_pass_php($text, &$uid, &$bbcode_tpl)
{
global $lang;

$php_start_html = $bbcode_tpl['php_open'];
$php_start_html = str_replace('<td class="code">', '<td class="code" style="font-size:12px;">', $php_start_html);
$php_end_html = $bbcode_tpl['php_close'];

$match_count = preg_match_all("#[php:1:$uid](.*?)[/php:1:$uid]#si", $text, $matches);

for( $i=0 ; $i<$match_count ; $i++ )
{
$before_replace = $matches[1][$i];
$after_replace = trim($matches[1][$i]);

$trans_tbl = get_html_translation_table(HTML_ENTITIES);
$trans_tbl = array_flip($trans_tbl);
$after_replace = strtr($after_replace, $trans_tbl);

if( (substr($after_replace, 0, 2) != '<?') && !(strpos($after_replace, '<?')) )
{
$after_replace = "<?phpn" . $after_replace;
}
if( (substr($after_replace, -2, 2) != '?>') && !(strpos($after_replace, '?>')) )
{
$after_replace = $after_replace . "n?>";
}

$after_replace = str_replace(' ', ' &', $after_replace);
$after_replace = str_replace("t", '&&', $after_replace);
$after_replace = str_replace(',', ', ', $after_replace);
$after_replace = str_replace(', ', ', ', $after_replace);

$lines = explode("n", $after_replace);
for( $q=0 ; $q < count($lines) ; $q++ )
{
$lines[$q] = trim($lines[$q]);

if( (strlen($lines[$q]) > 80) && !strstr($lines[$q], '&') && !strstr($lines[$q], ' ') )
{
$lines[$q] = wordwrap($lines[$q], 80, "n", 1);
}

$lines[$q] = $lines[$q] . "rn";
}

$after_replace = trim(implode('', $lines));

// highlight string
$after_replace = highlight_string($after_replace, TRUE);

$replacement = $php_start_html;
$replacement .= $after_replace;
$replacement .= $php_end_html;

$str_to_match = "[php:1:$uid]" . $before_replace . "[/php:1:$uid]";

$text = str_replace($str_to_match, $replacement, $text);
}

$text = str_replace("[php:$uid]", $php_start_html, $text);
$text = str_replace("[/php:$uid]", $php_end_html, $text);
$text = str_replace('&', '&', $text);

$text = str_replace('&</font><font color="#0000CC">nbsp</font><font color="#006600">;', '&', $text);
$text = str_replace('&</font><font color="#0000BB">nbsp</font><font color="#007700">;', '&', $text);
$text = str_replace(',&', ', ', $text);
$text = str_replace('&&', ' &', $text);

$text = str_replace($php_start_html."<code><font color="#000000">n", $php_start_html.'<font color="#000000">', $text);
$text = str_replace("</font>n</code>".$php_end_html, "</font>".$php_end_html, $text);

$font[1] = "#<font color="(.*?)">#si";
$font_replace[1] = "<font color="1"><code>";
$font[2] = "#</font>#si";
$font_replace[2] = "</code></font>";
$text = preg_replace($font, $font_replace, $text);

$text = str_replace('&</code>', ' </code>', $text);
$text = str_replace(' </code>', '& </code>', $text);

return $text;

} // bbencode_second_pass_php()
?>[/php:1:9dd391a294]
Cudi
Dzięki za ten kod, bardzo pomógł mi w udoskonaleniu mojej funkcji do kolorowania kodu między odpowiednimi znacznikami. Co prawda tekst rozdzialam troche inaczej, ale bardzo przydał mi sie sposób sprawdzania czy w kodzie do pokolorowania występuje <?php i ?>. Z tym że ja to dodaje tylko na czas pokolorowania, a potem sie tego pozbywam. Dorobiłem także numerowanie lini.

Ps.
Bardzo chciałbym aby kolorowanie kodu na tym forum wyglądało podobnie jak tu.

[ url update'owany ]
DeyV
Tak - to jest dobry pomysł - choć z drugiej strony kolorowałby fragmenty kodu HTML, gdyby przyadkowo się nawinął przed lub po kodzie php (ale to drobiazg winksmiley.jpg )

Natomiast jak już mówimy o optymalizacji forum bb, to wydaje mi się, że prostym, a zarazem bardzo owocnym sposobem byłoby zapisywanie w pełni 'przekompilowanych' postów (cały html). Dzięki temu, że wszystkie texty postów są w osobnej tabeli , nie byłloby to trudne - wystarczyłaby dodatkowa kolumna w tabeli posts_text, oraz warunek, czy jest już wersja 'skompilowana' czy też należy uruchomić bbencode_second_pass. Właściwie można by sie wtedy posunąć jeszcze dalej - całkowicie zrezygnować z zapisywanie w bazie wyniku first_pass, (które trzeba odkodowywać), przechowywując tylko orginalny post, oraz jego 'wizulaną reprezentacje'.
scanner
Może zacznijmy od tego, zeby wreszcie odseparować CSS? Bo ten temat był poruszany kilka miesięcy temu, a CSS wciąż siedzi zagnieżdzony w html'u, a to w końcu 7 kilobajtów tekstu.
Cudi
Bardzo trafna uwaga, a do tego to nie jest nic trudnego do zrobienia, jeśli dobrze mi sie wydaje to wystarczy wywalić style z szablonu headera i potem tylko "odkomentować" to:
Kod
<!-- link rel="stylesheet" href="templates/subSilver/subSilver.css" type="text/css" -->


Style zajmują prawie 8 kb!
KaMeLeOn
Cytat
Może zacznijmy od tego, zeby wreszcie odseparować CSS? Bo ten temat był poruszany kilka miesięcy temu, a CSS wciąż siedzi zagnieżdzony w html'u, a to w końcu 7 kilobajtów tekstu.

Zrobi się ale nie wszystko na raz...
DeyV
Na razie udało nam sie zrobić coś innego.
Zobaczcie, czy tak kolorowany kod php, z numeracją wierszy by Wam odpowiadał.
:arrow: http://www.mstudio.nq.pl/php_pl/dodatki/fo...mbb-bbcode1.jpg
Czekamy również na ewentualne propozycje.

____________________________________
*16:15 * to wersja z numerowaniem od 1 (dzięki Cudi) :arrow: http://www.mstudio.nq.pl/php_pl/dodatki/fo...mbb-bbcode2.jpg

*19:00 * Na podanych grafikach jest napisane, że system na razie nie będzie obsługiwał & nbsp; i & amp; To już nie jest prawda smile.gif
Cudi
Jest bardzo dobrze, tylko jeszcze taka mała sugestia, czy numeracja lini nie powinna sie zaczynać od 1 ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.