TinyMCE jest edytorem z kategorii wysiwyg - czyli “widzimy” jak treść będzie wyglądała po wyświetleniu użytkownikowi. Niestety nie zdarzyło mi się jeszcze zobaczyć tak przygotowanego edytora by rzeczywiście odwzorowywał style, nie mówię że jest to niemożliwe czy nawet bardzo trudne, po prostu najczęściej zaniedbywane - podstawowe style zazwyczaj działają (pogrubienie, kursywa, itp.).
Sądzę że najgorszym momentem jest gdy użytkownik będzie chciał dodać do treści widgeta złożonego z css/js, jako że tinymce jest edytorem html’a umożliwia wykonanie wszystkiego, nawet dodanie inlinowo do treści stylów i zewnętrznych javascript'ów a następnie węzła script z odpowiednim kodem inicjalizującym widget’a. Tak, będzie działało. Z punktu widzenia developera takie użycie zepsuje wiele dobrych praktyk - minifikacja, opóźnione ładowanie js (a co gdy np. jQuery jest załączane PO widgecie?),
Próbując znaleźć idealną odpowiedź na to pytanie, sporządziłem listę rzeczy która powinna być wspierana przez edytora:
- prezentacja w jakiś sposób wyglądu końcowego
- by użytkownik nie mógł “psuć” strony - załączać w treści nowych bibliotek, zmiana styli, dodawanie tagów skopiowanych z word’a czy też innych programów Microsoft’u
- możliwość implementacji “interfejsów” przez developera - by użytkownik mógł w znormalizowany i kontrolowany przez developera sposób dodawać różne elemeny/widgety/embedować pliki
Dość szybko trafiłem na MarkItUp!. Pozwala on na zdefiniowanie własnego schematu który będzie później parsowany przez stronę serwerową, dostarcza możliwość podglądu aktualnie edytowanej treści (tutaj to samo ograniczenie co w tinymce - jeśli developer nie doda styli ze strony, podgląd nie będzie tak zbliżony do prawdziwego wyglądu jakby mógł być). Po stronie serwerowej wybrałem pythonowe Docutils z obsługą ReStructuredText (używane też na github’ie).
Plusy
- Potrzeba sposobu na kolorowanie kodu? Nie ma problemu - wystarczy zarejestrować bibliotekę pygments jako funkcję w docutils
- Dodawanie obrazka? Jest. Ma być po prawej? dodajemy align: right do opcji metody
W skrócie - trzeba dodać funkcjonalność X? Dodajemy nową funkcję rest_X do docutils :)
Minusy
- Trzeba wiedzieć że jest to parsowane jako ReST
- Znajomość struktury
Decyzję zostawiam wam :)