Kolorowanie kodu na forum
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
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.
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.