Skocz do zawartości

wiesniak@Blog.FA

  • wpisy
    12
  • komentarzy
    134
  • wyświetleń
    40065

Kolorowanie kodu na forum


wies.niak

742 wyświetleń

Hejo!

Czasu ostatnio mało, więc i wpis będzie krótki. Źródła, jak zwykle, na końcu. Do boju :-)

Na forum dysponujemy dość ograniczonymi możliwościami kolorowania składni prezentowanego kodu. Mamy tag [code], który nic nie koloruje, ale zachowuje wszystkie białe znaki oraz prezentuje tekst za pomocą czcionki o stałym rozmiarze. Mamy tag

[codebox], który robi to samo co poprzednik, ale przetwarza BBCode i dłuższy kod prezentuje w przewijanym okienku. Mamy też tagi [html] oraz [sql] kolorujące kod HTML oraz SQL. I to tyle.

Pisząc poprzednie wpisy nie podobało mi się, że dłuższe partie kodu w C# czy ASP.NET wyglądają po prostu paskudnie. Stworzyłem więc prosty program, który zajmuje się kolorowaniem wrzuconego tekstu.
blogentry-7427-1332170007.png
Idea działania jest bardzo prosta: kopiujemy sformatowany, pokolorowany tekst z naszego ukochanego środowiska programistycznego, po czym wklejamy go do mojego programiku. Klikamy ?GO? i po chwili w prawym polu tekstowym dostajemy tekst w sformatowany z użyciem BBCode. Wymaganie jest jedno: program, z którego kopiujemy treść musi kopiować również informacje o formatowaniu tekstu.

Cała aplikacja powstała w WPF. Projekt jest bardzo mały i dostosowany do moich potrzeb. Dlatego też ma ustawioną na sztywno czcionkę Courier New oraz czarne tło (o tym jeszcze za chwilę). Pole, do którego wklejamy to tekst to RichTextBox. Dzięki temu możemy w nim wrzucić tekst sformatowany, a w kodzie przeczytać zawartość i przetworzyć na BBCode.
Algorytm konwersji jest bardzo prosty. Przechodzimy po kolejnych słowach i sprawdzamy ich kolor. Jeśli kolor słowa różni się od poprzedniego koloru (pustego na początku) to zamykamy poprzedni tag koloru jeśli był otwarty, po czym otwieramy nowy tag i wstawiamy z nowym kolorem, a następnie doklejamy bieżące słowo. I tak do końca.

Tak kształtował się w całości pierwotny algorytm. Miał on jednak zasadniczą wadę, którą był rozmiar generowanego tekstu wyjściowego. Postanowiłem go odrobinę odchudzić i wprowadziłem prostą analizę statystyczną. Przeszukuję cały tekst i zbieram informację o ilości wystąpień każdego z pojawiających się kolorów. Następnie biorę kolor najczęściej występujący i pomijam go przy przetwarzaniu opisanym w poprzednim akapicie. Na koniec opakowuję cały tekst w ten najpopularniejszy kolor, przez co kod niekolorowany przyjmuje wartość najpopularniejszą. Daje to zauważalną oszczędność.

Przy testowaniu wyszedł jeszcze jeden problem, a mianowicie kolor tła. Mając dwie całkowicie przeciwne kolory skórek, pod jedną z nich kod po prostu był nieczytelny. Dlatego też wprowadziłem nowy tag na forum [codeboxbg]. Pisząc
[codeboxbg=red]tekst[/codeboxbg]

sprawiamy, że tło całego bloku będzie czerwone. Poza tym nowy tag odrobinę bardziej dostosowuje się do wysokości ? jeśli tekstu jest mało, jest mały, jeśli więcej, to jest wyższy, a jeśli jeszcze więcej, to pojawia się pasek przewijania. Tego właśnie tagu używam do opakowania całego kodu wyjściowego ? widać to na screenie.

Jak wspomniałem wcześniej, kod jest bardzo spersonalizowany, więc czcionka czy kolor tła ramki są zaszyte na stałe, natomiast cały kod jest pisany brzydko, bez regionów itd., ale aplikację pisałem na szybko, więc dałem sobie siana z tym.

I tyle na dziś. Zapraszam do pobierania kodu, korzystania z aplikacji i oczywiście komentowania. Chętnie zobaczę rozwiniętą wersję:-) Aplikacja nie obsługuje tła tekstu, ale odpowiedni bbcode ([bg]) na forum jest więc dodać można.

[edit]

Aha! Jeśli ktoś zna jakiś fajny tekst o obsłudze RichTextBox albo może stworzyć taki poradnij (coś więcej niż "jak dodać dwa akapity z kolorem i czcionką") to chętnie przeczytam, bo obsługa kontrolki póki co wydaje mi się lekko koszmarna i toporna.

Kod: RtfToBBCodeConverter___src.zip

Aplikacja (wymaga .NET 4): RtfToBBCodeConverter___release.zip

0 komentarzy


Rekomendowane komentarze

Brak komentarzy do wyświetlenia.

Gość
Dodaj komentarz...

×   Wklejony jako tekst z formatowaniem.   Wklej jako zwykły tekst

  Maksymalna ilość emotikon wynosi 75.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...