STC_editor
Qt text editor for STC markup used on cpp0x.pl
Loading...
Searching...
No Matches
STC_editor

en Build Status: Linux Build Status: Windows Building & running tests

Totus Tuus

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):

  1. 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.
  2. Weryfikacja zamknięcia znaczników: Sprawdza, czy wszystkie znaczniki STC są poprawnie zamknięte.
  3. Transformacja tekstu: Zmiana zaznaczonego tekstu na małe litery, wielkie litery, camelCase na snake_case lub odwrotnie.
  4. 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.
  5. 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
  6. 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).
  7. 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".
  8. Kompilacja kodu C++: Kliknij prawym przyciskiem wewnątrz [cpp]...[/cpp], aby skompilować kod za pomocą g++ (wymaga zainstalowanego g++).
  9. 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.

  1. 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.

  1. Śledzenie zmian: Śledzi zmienione linie za pomocą biblioteki pydifflib-cpp.
  2. Listowanie kodów w pliku: Oddzielny widget, który śledzi na bieżąco pozycje kodów [cpp] i innych.
  3. 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]
  4. 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
  5. Ś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.
  6. 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
  7. 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.
  8. 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]
  9. 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.
  10. 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.
  11. 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.
  12. 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.
  13. 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
  14. 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ę
  15. 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.
  16. 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:

  1. Operacje na plikach: Wczytywanie, zapisywanie i przeładowanie pliku. Również zmiana nazwy otwartego pliku.
  2. 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.
  3. Wykrywanie zmian zewnętrznych: Powiadamia o modyfikacjach pliku z zewnątrz.
  4. 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
  5. Kopiowanie ścieżki pliku: Kopiowanie nazwy pliku lub pełnej ścieżki do schowka.
  6. Kontrola wcięć: Tab przesuwa zaznaczony tekst w prawo, Shift+Tab w lewo.
  7. Lista skrótów: Dostępna z menu aplikacji.
  8. 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.
  9. 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).

  1. Oznaczenie aktualnej linii: Śledzenie aktualnej pozycji kursora klawiatury w ramach linijki
  2. 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.
  3. Ukrywalne widgety: wszystko poza edytorem tekstu można ukryć, dzięki temu pewne funkcje są wyłączone i edytowanie działa szybciej.
  4. Obsługa różnych kodowań pliku tekstowego: Nie tylko UTF-8. Jest to dzięki bibliotece uchardet.
  5. 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)
  6. Obsługa wielu języków: Obsługuje język angielski i polski.
  7. 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:

  1. Kliknij na najnowsze zakończone zadanie (workflow).
  2. Przewiń stronę na dół.
  3. 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

  1. Jak mam duży plik otwarty i chcę nowy pusty otworzyć to się ścina, to powinien być moment - wszystko wywalić i otworzyć puste
  2. Wyszukiwanie wielu słów w tej samej linii niezależnie od kolejności.
  3. Historia wprowadzanych zmian (Ctrl+Z).
  4. Pobieranie aktualizacji przez https://cpp0x.pl/xml/
  5. Szybsze wyjście z aplikacji - po prostu wyjście, bez przywracania stanu niewymagającego zapisu
  6. Integracja analizatora składni C++ (np. flex).
  7. Wyświetlanie statystyk zmian w czasie rzeczywistym (liczba linii, znaków, rozmiar pliku, linia i kolumna).
  8. Integracja dokumentacji cppreference (jak w cppman lub QtCreator).
  9. FindWidget - aby aktualizował pozycje w tekście na bieżąco przy dodawaniu/usuwaniu linii.
  10. Szukanie tylko w kodzie
  11. Może AI mi podzieli CodeEditor aby nie był GodObject
  12. Historia zmian w linii
  13. Rezultat komendy w edytorze.
  14. Ctrl + V gdy mamy obrazek w schowku - wtedy powinno zaproponować umieszczenie obrazka w odpowiednim katalogu
  15. Gdy wyświetlamy diffa, ale linie są długie to pojawia się scrolling area, a nie powinna.
  16. 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
  17. Podpięcie sztucznej inteligencji np. Ollama lub llama.cpp
  18. Precompiled headers dla CodeEditor.h i moduły
  19. Kreator tabel dla znaczników STC.
  20. PreviewWidget: Śledzenie pozycji między pozycją w dokumencie źródłowym a podglądem HTML
  21. IWYU podpiąć pod CMake'a
  22. Skróty Alt+Lewo i Alt+Prawo do nawigacji wstecz/dalej po pozycjach w kodzie.
  23. Blokowanie pliku, który się edytuje.
  24. Zwijanie nagłówków i kodu (jak funkcje w środowiskach programistycznych)
  25. Optymalizacja wydajności edytora przy szybkim pisaniu.
  26. W danej linii da się wpisać dane np.: QTextBlockUserData i potem block.setUserData(data); - może da się to wykorzystać w optymalizacji
  27. A może do szukania błędów (niezamkniętych tagów) zaprzędz analizator składniowy: https://www.antlr.org/ ?
  28. Podgląd terminala np. przez https://github.com/lxqt/qtermwidget - tylko czy mi to nie zrobi GPLa?
  29. Zastąpienie listy kontekstu widżetem drzewiastym.
  30. W linijce gradient ostatnio używanych linii z numerami ile temu
  31. Ukrycie tagów, nie licząc otaczających (rich text editor)
  32. Możliwość wyłączenia poszczególnych aspektów kolorowania składni.
  33. Następna/poprzednia zmiana: przycisk pozwalający skakać po zmianach w dokumencie
  34. Sensowne funkcjonalności z innych podobnych edytorów np. Scribe-Text-Editor
  35. Podgląd strony internetowej po najechaniu myszką
  36. Wsparcie dla MD na bazie: https://github.com/Qt-Widgets/notes
  37. Inne widgety np. https://github.com/Qt-Widgets/SlidingStackedWidget-1 z listy: https://github.com/Qt-Widgets/ lub https://qwt.sourceforge.io/index.html
  38. Skanowanie dokumentu w osobnym wątku dla lepszej wydajności.
  39. Nagrywanie i odtwarzanie makr.
  40. Obsługa wtyczek, być może z użyciem Lua.
  41. Zamiana prefiksów adresów URL dla obrazów na serwerze.
  42. Dyktowanie tekstu (biblioteka Whisper)
  43. Skróty Alt+Lewo i Alt+Prawo do nawigacji wstecz/dalej po pozycjach w kodzie.
  44. Otwieranie wielu plików jednocześnie.
  45. Widok sąsiadujący do porównywania plików.
  46. Eksport bloków kodu do osobnych plików.
  47. Konsolidacja obrazów do jednego katalogu z aktualizacją ścieżek w znacznikach STC.
  48. Przy porównywaniu difa niezapisanych zmian z zawartością pliku (linijka w linijkę): możliwość zapisania na dysk poszczególnych linii.
  49. 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ć):

  1. Zmiana wielkości czcionki powinna też wpłynąć na czcionkę w ramach numeracji linii
  2. 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
  3. 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ł.

Documentation dla programistów

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:

  1. W jakiej sytuacji (Sekwencja kroków)
  2. Kod STC, który to spowodował
  3. 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

  1. pydifflib-cpp - Do śledzenia zmian w liniach. Licencja: BSD 3-Clause.
  2. diff-match-patch-cpp-stl - Do różnic na poziomie znaków w obrębie linii. Licencja: Apache 2.0.
  3. uchardet - Do wykrywania kodowania plików (nie tylko UTF-8). Licencja: Mozilla Public License.
  4. nuspell - Do sprawdzania pisowni, wykorzystuje słowniki Hunspell.
  5. StripCppComments - Do usuwania komentarzy z kodu C++. Licencja: MIT.
  6. 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.