

Edytor STC
Prosty edytor tekstu stworzony w Qt, ułatwiający wstawianie znaczników STC używanych na platformie Cpp0x.pl.
Opis
Edytor ten został zaprojektowany, aby uprościć pracę z językiem znaczników STC na potrzeby tworzenia treści dla cpp0x.pl. Oferuje prosty interfejs oparty na Qt z polem tekstowym i przyciskami do wstawiania znaczników STC oraz dedykowane funkcje zwiększające produktywność.
Przykładowy screen aplikacji
Dedykowane funkcje
Jak ktoś chce tego używać na potrzeby pisania na stronę Cpp0x.pl (do czego zachęcam):
- Kolorowanie składni: Podświetlanie znaczników STC dla lepszej czytelności.
- Kolorowanie składni C++ w ramach znaczników
[cpp]...[/cpp]. Jest to zaimplementowane przy wykorzystaniu QCodeEditor (autorstwa Megaxela, bazując na forku ArsMasiuk).
- Kolorowanie składni Pythona w ramach znaczników
[py]...[/py] (zarówno blokowo, jak i w linii), łącznie z wieloliniowymi łańcuchami """...""". Reguły są oparte na słownikach i kolorach z QCodeEditor.
- Weryfikacja zamknięcia znaczników: Sprawdza, czy wszystkie znaczniki STC są poprawnie zamknięte.
- Transformacja tekstu: Zmiana zaznaczonego tekstu na małe litery, wielkie litery, camelCase na snake_case lub odwrotnie.
- Podgląd kontekstu dokumentu:
- Wykrywa znaczniki (np.
[h1]Nagłówek[/h1]), ich numery linii oraz zawartość (np. „Nagłówek”).
- Umożliwia przejście do określonych pozycji w dokumencie na podstawie kontekstu.
- Filtrowanie wybranych znaczników (np. tylko
[h1]).
- Śledzenie pozycji kursora w kontekście dokumentu w czasie rzeczywistym.
- Podgląd obrazów: Najedź myszą na
[img src="ścieżka/do/obrazu.png"], aby zobaczyć podgląd obrazu (wymaga prawidłowej ścieżki).
- Podgląd również obrazków z internetu
- Usuwanie znaczników: Kliknij prawym przyciskiem wewnątrz znaczników (np.
[b]Pogrubiony tekst[/b]), aby usunąć znaczniki, pozostawiając tylko treść (np. Pogrubiony tekst).
- Formatowanie kodu C++: Kliknij prawym przyciskiem wewnątrz
[cpp]...[/cpp], aby sformatować kod za pomocą clang-format (wymaga zainstalowanego clang-format).
- Jeśli obok pliku tekstowego znajduje się plik z ustawieniami formatowania ".clang-format" to zostanie on użyty, w przeciwny wypadku domyślne użyte zostanie "LLVM".
- Kompilacja kodu C++: Kliknij prawym przyciskiem wewnątrz
[cpp]...[/cpp], aby skompilować kod za pomocą g++ (wymaga zainstalowanego g++).
- Usuwanie komentarzy C++: Kliknij prawym przyciskiem wewnątrz
[cpp]...[/cpp], aby usunąć wszystkie komentarze z kodu C++ (wykorzystuje bibliotekę StripCppComments). Dodatkowo funkcja czyści nadmiarowe puste linie, pozostawiając maksymalnie dwie puste linie obok siebie.
Czyszczenie pustych linii: Kliknij prawym przyciskiem wewnątrz dowolnego tekstu, aby usunąć nadmiarowe puste linie, pozostawiając maksymalnie dwie puste linie obok siebie. Przydatne do porządkowania tekstu po usunięciu komentarzy lub ogólnego czyszczenia formatowania.
- Statystyki pliku: Wyświetla statystyki specyficzne dla STC, np. użycie znaczników, obok standardowych metryk edytora.
Nawigacja okruszkowa: Dynamicznie aktualizowany pasek adresu pokazujący bieżącą pozycję w strukturze dokumentu STC, z możliwością kliknięcia.
- Śledzenie zmian: Śledzi zmienione linie za pomocą biblioteki pydifflib-cpp.
- Listowanie kodów w pliku: Oddzielny widget, który śledzi na bieżąco pozycje kodów
[cpp] i innych.
- Dedykowane przeciągnij i upuść: Do aplikacji można przeciągać pliki i zostaną odpowiednio obsłużone:
- Ścieżka do plików graficznych zostanie otoczona tagami
[img src="ścieżka/do/przeciagnietego/obrazu.png"]
- Zawartość plików tekstowych o rozszerzeniach wskazujących na C/C++ zostanie wstawione i otoczona tagami
[cpp]...[/cpp]
- Zawartość pozostałych plików tekstowych zostanie wstawiona i otoczona tagami
[code]...[/code]
- Podgląd strony w czasie rzeczywistym: Jest możliwe użycie w programie backendu konwertującego kod ze znacznikami STC na kod HTML.
- Dostępne są również statystyki: ile danych wysłano i pobrano, widoczne po najechaniu myszką na obszar renderujący
- Śledzenie TODO w dokumencie: W podglądzie dokumentu widać komentarze
TODO: wraz z tekstem na prawo od tego, są one klikalne i wtedy przechodzą do danej pozycji.
- Klikalne linki: wewnątrz tagów z linkiem
[a href="..."] lub [a href="..." name="..."] możemy przytrzymać CTRL + lewy przycisk myszy i nam się otworzy dany link
- Wklejane linki wklejane w odpowiedni sposób: jak wklejamy przez CTRL+V, a w schowku jest link to otacza linka tagami linka
[a href="link"]
- Po chwili zostanie pobrana z linka i dodana jako kolejny atrybut nazwa strony, czyli zamiast
[a href="link"] będzie [a href="link" name="Nazwa strony dla linka"]
- Jeśli jest zaznaczony tekst to "podlinkowuje go" przez otoczenie:
[a href="link" name="Zaznaczony wcześniej tekst"]
- Jeśli wklejamy linka wewnątrz tagu
[img src=""] to jest wklejany jako zwykły tekst.
- Wklejalne tabelki: gdy w schowku jest tabelka to jest ona otaczana odpowiednimi tagami
[csv]...[/csv] a komórki są rozdzielane średnikami.
- Jeśli wklejony tekst zawiera tagi, to odpowiednie komórki są otaczane przez
[run], a typ tabelki się zmienia na [csv ext]
- Wklejanie rich-text: jak wkleimy tekst ze strony lub np. programu Office to HTML jest zamieniany na znaczniki STC (częściowo), m.in. linki, pogrubienia itp.
- Dodawanie/usuwanie atrybutów dla tagów z menu kontekstowego: Gdy klikniemy prawym przyciskiem myszy na tagu, które ma możliwe różne atrybuty, to pojawia się możliwość wyklikania opcjonalnych atrybutów do dodania/usunięcia.
- Przyciski do dodawania tagów STC (inteligentne przyciski): Obok tekstu są różne przyciski wspierające prawie wszystkie tagi STC. Kliknięcie przycisku powoduje albo wstawienie tagu w pozycji kursora tekstu, albo otoczenie zaznaczonego tekstu tagami.
- Przycisk
a href dostosowuje się do zaznaczonego tekstu, jak go nie ma to po prostu wstawia pusty tag, ale jak coś jest zaznaczone to próbuje wykryć tam link i odpowiednio otoczyć tagiem dopasowując zarówno linka jak i nazwę linka
- Przycisk
img dostosowuje się do zaznaczonego tekstu, jak go nie ma to po prostu wstawia pusty tag, ale jak coś jest zaznaczone to próbuje wykryć ścieżkę do pliku graficznego i odpowiednio otoczyć tagiem dopasowując zarówno źródło obrazka jak i opis
- Niektóre tagi mają inteligentne zaznaczenie np. jak mamy zaznaczony link i tekst, a chcemy otoczyć przez
[a href=...] to link wstawi w miejsce odnośnika a resztę tekstu jako nazwę linka.
- Podobnie jest z zaznaczeniem tekstu zawierającego ścieżkę do obrazka, a chcemy otoczyć przez
[img src...] to wtedy nazwa obrazka stanowi jego adres, a reszta zaznaczonego tekstu jego opis.
- Gdy mamy zaznaczony tekst, który jest już otagowany i wywołujemy ponowne tagowanie tego tekstu tymi samymi tagami to jeśli jest zaznaczony tekst z tagami lub wewnatrz tagów to zostaną te tagi usunięte.
- Sprawdzanie literówek (ang. spellcheck): teksty jest sprawdzany ze słownikiem (biblioteka nuspell), oraz są podkreślane nieistniejące wyrazy w języku polskim. Oczywiście w ramach tagów STC tekst jest pomijany (chyba, że atrybuty wymagające sprawdzenia, np. opis obrazka).
- Menu kontekstowe z podpowiedziamy poprawiającymi literówki.
- Inteligentne menu kontekstowe dla tagów: Po kliknięciu w tekście prawym przyciskiem myszy na tagu pojawiają się pewne specyficzne, dla danego tagu funkcjonalności:
- Po kliknięciu w ramach
[a href=...] pojawiają się akcje do obsługi linka
- Wizualny edytor tabel STC: Po kliknięciu PPM na
[csv...] pojawia się opcja edycji tabeli. Dzięki temu pojawia się wizualne okno, w którym możemy edytować tabelę.
- Jest również możliwość drag&drop między komórkami powodująca ich zamianę
- Wyszukiwanie na Cppreference po słowach kluczowych z kodu C++: jak w ramach tagów
[cpp]...[/cpp] klikniemy PPM na słowie to w menu kontekstowym pojawia się opcja wyszukiwania, po jej naciśnięciu pojawia się nam okno z cppreference dla danego hasła.
- Otwieranie opisu tagów STC: jak klikniemy PPM na dowolnym tagu otwierającym STC to pojawia się opcja w menu kontekstowym, której wybranie powoduje otwarcie podstrony kursu STC zawierającej ten tag.
Ogólne funkcje edytora
Edytor też nadaje sie do innych celów - do ogólnej edycji dokumentu, oto wybrane funkcjonalności, których brakuje mi w zwykłych edytorach:
- Operacje na plikach: Wczytywanie, zapisywanie i przeładowanie pliku. Również zmiana nazwy otwartego pliku.
- Ostatnio otwarte pliki: Zapamiętuje ostatnio używanpliki wraz z ostatnią pozycją w pliku dla szybkiego dostępu.
- Zapamiętana jest również data ostatniego otwarcia pliku w edytorze.
- Wykrywanie zmian zewnętrznych: Powiadamia o modyfikacjach pliku z zewnątrz.
- Inteligentne menu kontekstowe dla tekstu, m.in.:
- Numerowanie linii: Dodawanie numeracji do zaznaczonych linii przez menu kontekstowe (funkcja z menu kontekstowego). Również usuwanie numerów z linii.
- Poprawa numeracji dokumentu (gdy pewnych liczb brakuje, lub są zdublowane).
- Dodawania punktów do każdej linii zaznaczonego tekstu:
- Sortowanie zaznaczonych linijek: z pominięciem wielkości znaków
- Łączenie linii: Łączenie wielu zaznaczonych linii w jedną, oddzieloną spacjami (funkcja z menu kontekstowego).
- Konwersje między wielkością znaków zaznaczonego tekstu: na małe, na duże, CamelCase <-> snake_case
- Kopiowanie ścieżki pliku: Kopiowanie nazwy pliku lub pełnej ścieżki do schowka.
- Kontrola wcięć:
Tab przesuwa zaznaczony tekst w prawo, Shift+Tab w lewo.
- Lista skrótów: Dostępna z menu aplikacji.
- Wyszukiwanie tekstu:
- Wyszukiwanie z opcjami uwzględniania wielkości liter i dopasowania całych słów.
- Wyświetlanie liczby wystąpień:
- Z uwzględnieniem wielkości liter.
- Bez uwzględniania wielkości liter.
- Z uwzględnieniem wielkości liter, tylko całe słowa.
- Bez uwzględniania wielkości liter, tylko całe słowa.
- ENTER i SHIFT+ENTER odpowiednio przesuwają do kolejnego/poprzedniego wystąpienia z tabeli
- Strzałki dół/góra dzialają jak powyższe, ale nie przeskakują z focusem do edytora tekstu
- Wyszukiwania podświetlają wszystkie wystąpienia w tekście
Ctrl+R włącza tryb zamiany: każde znalezione miejsce ma checkbox, dzięki czemu można wybrać dokładnie te wystąpienia, które mają zostać zmienione.
- Opcja Skip already replaced pomija wyniki będące już częścią tekstu zastępującego, np. nie zamieni
cout wewnątrz std::cout.
- Skalowanie czcionki: Powiększanie/pomniejszanie czcionki za pomocą
Ctrl++ i Ctrl+- lub Ctrl+MOUSE_SCROLL.
Pasek stanu: Pokazuje nazwę otwartego pliku, ale też liczbę niezapisanych zmienionych linii, czas ostatniej edycji i zapisu (tylko przy niezapisanych zmianach).
- Oznaczenie aktualnej linii: Śledzenie aktualnej pozycji kursora klawiatury w ramach linijki
- Szczegółowy wykaz niezapisanych zmian: Gdy mamy niezapisane zmiany i próbujemy wyjść z programu to poza spytaniem użytkownika czy na pewno chce wyjść bez zapisania zmian pojawia się od razu diff w formie tabeli pokazujący różnice w odpowiadających sobie liniach.
- Możliwść przywrócenia zmian względem danej linii z dysku.
- Zmiany mają również pokazane różnicę w numerach poszczególnych znaków, wtedy możemy lepiej odróżnić znaki, które "na oko" są takie same.
- Ukrywalne widgety: wszystko poza edytorem tekstu można ukryć, dzięki temu pewne funkcje są wyłączone i edytowanie działa szybciej.
- Obsługa różnych kodowań pliku tekstowego: Nie tylko UTF-8. Jest to dzięki bibliotece uchardet.
- Stoper pracy: stoper, który odpala się po uruchomieniu edytora i liczy zarówno czas kiedy edytor jest włączony, jak i czas pracy w edytorze (wykrywa naciśnięcia klawiszy, gdy ich długo nie ma to się zatrzymuje)
- Obsługa wielu języków: Obsługuje język angielski i polski.
- Tryby składni całego pliku: Menu
Składnia pozwala przełączać między trybami: STC, Zwykły tekst, C++, Python, XML i JSON. Przy otwieraniu pliku tryb jest dobierany po rozszerzeniu (np. .py → Python, .cpp/.h/.hpp → C++, .xml/.svg/.ui/.qrc → XML, .json → JSON, .md/.rst → zwykły tekst), a dla pozostałych rozszerzeń, w tym .txt (w którym zapisywane są artykuły STC), używany jest tryb STC. Tryb wybrany ręcznie z menu jest zapamiętywany dla danego pliku, więc np. notatka .txt otwiera się następnym razem jako zwykły tekst. W trybach kodu edytor używa czcionki o stałej szerokości i nie interpretuje znaczników STC, więc [b] w kodzie Pythona pozostaje zwykłym indeksowaniem. Tryb Zwykły tekst nie ma żadnych znaczników: działa w nim sprawdzanie pisowni, a linki (https://..., www....) i adresy e-mail są kolorowane i podkreślane (ich fragmenty nie są zgłaszane jako błędy pisowni). Dialog otwierania ma filtry: pliki .txt, pliki kodu i danych oraz wszystkie pliki.
⬇️ Pobieranie (najnowsza wersja zbudowana automatycznie)
Możesz pobrać najnowszą skompilowaną wersję STC_editor, z ostatniego poprawnie zakończonego procesu budowania przez GitHub Actions (wymagane konto na Github - tak oni wymyślili):
👉 ⬇️ Pobierz wersję skompilowaną w formacie AppImage (działa na systemie Linux) 👉 ⬇️ Pobierz wersję skompilowaną na Windowsa
Po przejściu pod powyższy link:
- Kliknij na najnowsze zakończone zadanie (workflow).
- Przewiń stronę na dół.
- Pobierz artefakt o nazwie
STC_editor-x86_64.AppImage lub STC_editor-win64.zip
📦 ⬇️ Pobierz najnowszą wersję release
Aktualnie brak opublikowanych wydań (release). Gdy się pojawią — będą dostępne tutaj.
Planowane funkcjonalności
- Jak mam duży plik otwarty i chcę nowy pusty otworzyć to się ścina, to powinien być moment - wszystko wywalić i otworzyć puste
- Wyszukiwanie wielu słów w tej samej linii niezależnie od kolejności.
- Historia wprowadzanych zmian (
Ctrl+Z).
- Pobieranie aktualizacji przez https://cpp0x.pl/xml/
- Szybsze wyjście z aplikacji - po prostu wyjście, bez przywracania stanu niewymagającego zapisu
- Integracja analizatora składni C++ (np. flex).
- Wyświetlanie statystyk zmian w czasie rzeczywistym (liczba linii, znaków, rozmiar pliku, linia i kolumna).
- Integracja dokumentacji cppreference (jak w
cppman lub QtCreator).
- FindWidget - aby aktualizował pozycje w tekście na bieżąco przy dodawaniu/usuwaniu linii.
- Szukanie tylko w kodzie
- Może AI mi podzieli CodeEditor aby nie był GodObject
- Historia zmian w linii
- Rezultat komendy w edytorze.
- Ctrl + V gdy mamy obrazek w schowku - wtedy powinno zaproponować umieszczenie obrazka w odpowiednim katalogu
- Gdy wyświetlamy diffa, ale linie są długie to pojawia się scrolling area, a nie powinna.
- Rozważyć użycie tej samej biblioteki do porównywania zarówno linii jak i znaków np. https://github.com/google/diff-match-patch
- Podpięcie sztucznej inteligencji np. Ollama lub llama.cpp
- Precompiled headers dla CodeEditor.h i moduły
- Kreator tabel dla znaczników STC.
- PreviewWidget: Śledzenie pozycji między pozycją w dokumencie źródłowym a podglądem HTML
- IWYU podpiąć pod CMake'a
- Skróty
Alt+Lewo i Alt+Prawo do nawigacji wstecz/dalej po pozycjach w kodzie.
- Blokowanie pliku, który się edytuje.
- Zwijanie nagłówków i kodu (jak funkcje w środowiskach programistycznych)
- Optymalizacja wydajności edytora przy szybkim pisaniu.
- W danej linii da się wpisać dane np.:
QTextBlockUserData i potem block.setUserData(data); - może da się to wykorzystać w optymalizacji
- A może do szukania błędów (niezamkniętych tagów) zaprzędz analizator składniowy: https://www.antlr.org/ ?
- Podgląd terminala np. przez https://github.com/lxqt/qtermwidget - tylko czy mi to nie zrobi GPLa?
- Zastąpienie listy kontekstu widżetem drzewiastym.
- W linijce gradient ostatnio używanych linii z numerami ile temu
- Ukrycie tagów, nie licząc otaczających (rich text editor)
- Możliwość wyłączenia poszczególnych aspektów kolorowania składni.
- Następna/poprzednia zmiana: przycisk pozwalający skakać po zmianach w dokumencie
- Sensowne funkcjonalności z innych podobnych edytorów np. Scribe-Text-Editor
- Podgląd strony internetowej po najechaniu myszką
- Wsparcie dla MD na bazie: https://github.com/Qt-Widgets/notes
- Inne widgety np. https://github.com/Qt-Widgets/SlidingStackedWidget-1 z listy: https://github.com/Qt-Widgets/ lub https://qwt.sourceforge.io/index.html
- Skanowanie dokumentu w osobnym wątku dla lepszej wydajności.
- Nagrywanie i odtwarzanie makr.
- Obsługa wtyczek, być może z użyciem Lua.
- Zamiana prefiksów adresów URL dla obrazów na serwerze.
- Dyktowanie tekstu (biblioteka Whisper)
- Skróty
Alt+Lewo i Alt+Prawo do nawigacji wstecz/dalej po pozycjach w kodzie.
- Otwieranie wielu plików jednocześnie.
- Widok sąsiadujący do porównywania plików.
- Eksport bloków kodu do osobnych plików.
- Konsolidacja obrazów do jednego katalogu z aktualizacją ścieżek w znacznikach STC.
- Przy porównywaniu difa niezapisanych zmian z zawartością pliku (linijka w linijkę): możliwość zapisania na dysk poszczególnych linii.
- Sprawdzania:
- Sprawdzanie, czy znaczniki
[run] znajdują się wewnątrz [pkt].
- Weryfikacja, czy wszystkie znaczniki są zamknięte (np. po opuszczeniu linijki sprawdzamy czy są tam zmiany, jak tak, to czy jest tam nowy tag)
- Weryfikacja odpowiednich atrybutów w tagach (czy w cudzysłowiu, czy tylko dozwole atrubytu)
- Weryfikacja czy wprowadzono tylko legalne tagi STC
- Sprawdzenie czy link istnieje
- Dodać check: czy nie zamykam nieotwartego tagu?
- Sprawdzenie czy Run nie jest poza csv lub pkt
Min Bugi (czyli wcale nie trzebaich poprawiać):
- Zmiana wielkości czcionki powinna też wpłynąć na czcionkę w ramach numeracji linii
- MiniBug: funkcjonalność zmiany wielkości czcionki zakłóca nowe tagi. Jak powiększymy czcionkę i potem dodamy coś np. H1, to on będzie miał czcionkę nawet mniejszą niż reszta, mimo iż to nagłówek
- Usuwanie całych linii z pliku nie zmienia tytułu okna: jak dodajemy linie lub coś zmieniamy to w tytule okna pokazuje ile linii zmieniono, jednakże gdy linie są usuwaneto nie pokazuje. Trzeba by zmienić sposób wykrywania zmian przez bibliotekę, a następnie zmienić generowany tytuł.

Dokumentacja kodu
Dokumentacja API generowana jest przez Doxygen i publikowana automatycznie po każdym pushu na master: 👉 https://baziorek.github.io/STC_editor/
Lokalnie: doxygen Doxyfile w katalogu głównym, wynik w _docs/html/index.html.
Współpraca
Zapraszam do współpracy! Propozycje zmian i pull requesty są mile widziane, aby uczynić ten edytor jeszcze bardziej użytecznym.
Znalezione bugi?
Bardzo proszę o dokładne informacje jakie to bugi, czyli:
- W jakiej sytuacji (Sekwencja kroków)
- Kod STC, który to spowodował
- Jakie jest oczekiwane zachowanie wg Ciebie?
Przydatność
Narzędzie to okazało się bardzo pomocne przy tworzeniu artykułów na Cpp0x.pl, np. porównującym python i C++. Ułatwia wstawianie znaczników STC i debugowanie niezamkniętych znaczników.
Przydatne linki
Używane biblioteki zewnętrzne
- pydifflib-cpp - Do śledzenia zmian w liniach. Licencja: BSD 3-Clause.
- diff-match-patch-cpp-stl - Do różnic na poziomie znaków w obrębie linii. Licencja: Apache 2.0.
- uchardet - Do wykrywania kodowania plików (nie tylko UTF-8). Licencja: Mozilla Public License.
- nuspell - Do sprawdzania pisowni, wykorzystuje słowniki Hunspell.
- StripCppComments - Do usuwania komentarzy z kodu C++. Licencja: MIT.
- ArsMasiuk/QCodeEditor (będący forkiem Megaxela/QCodeEditor) - edytor tekstowy w Qt, który ma kolorowanie składni dla C++, Python i innych. Licencja MIT.
Słowniki (język polski)
Aplikacja wykorzystuje słowniki Hunspell (pl_PL.aff, pl_PL.dic) udostępnione w ramach projektu LibreOffice.
Słowniki te są objęte licencją Mozilla Public License v2.0 (MPL-2.0).
Oryginalne źródła pobrane z repozytoriów libreoffice
Autorzy i szczegóły licencji znajdują się w plikach:
Ostrzeżenie
Edytor jest prostym narzędziem i nie został gruntownie przetestowany pod kątem niezawodności. Używaj go na własne ryzyko, ponieważ może nie zachować ważnych treści. Jak dotąd jednak nie zawiódł autora.