Ticket #26 (closed task: fixed)
parser formatowania wiki
Reported by: | dozzie | Owned by: | dozzie |
---|---|---|---|
Priority: | normal | Milestone: | połączenie logiki z UI |
Component: | Keywords: | ||
Cc: | Parent ID: |
Description
Trzeba będzie napisać parser języka wiki (propozycja składni).
Parser powinien przede wszystkim produkować drzewo wyprowadzenia. To drzewo będzie jeszcze modyfikowane przed wytworzeniem HTML-a do wyświetlenia (głównie chodzi o makra zwracające listy elementów).
Child Tickets
Change History
comment:2 Changed 8 years ago by dozzie
Notatka: dla automatycznego uruchomienia parsera i zapisania drzewa wyprowadzenia mogę się wpiąć w sygnał pre_save: https://docs.djangoproject.com/en/1.2/topics/signals/
comment:3 Changed 8 years ago by dozzie
Dalsza podpowiedź o sygnałach:
# models.py class WikiPage(models.Model): # ... def set_content(self, content): self.content = content # could be no-op self.ast = '{"msg":"here would be parse tree for this object"}' # still models.py from django.db.models import signals def wikipage_update_ast(sender, instance, *args, **kwargs): instance.set_content(instance.content) signals.pre_save.connect(wikipage_update_ast, sender = WikiPage)
comment:4 Changed 8 years ago by dozzie
Wisent jest dość trudny w pracy nad nową gramatyką (brakuje mu komunikatów diagnostycznych), ale jest bardzo bliski możliwościami perlowemu modułowi Parse::Eyapp, który z kolei komunikaty diagnostyczne ma jak trzeba.
Udało mi się połączyć kod pythonowy z perlowym w taki sposób, że parser napisany w Perlu jest używalny z pythonowej aplikacji, więc prace nad gramatyką mogą się posuwać normalnie, a potem dość prostym konwerterem gramatyka dla Parse::Eyapp jest zamieniana na gramatykę dla Wisenta.
Obecny wygląd gramatyki nie pozwala na użycie pełni zaplanowanych możliwości (np. brak zagnieżdżonego formatowania, brak list, bloków kodu, %bloków), ale jest bardzo dobrym punktem startowym.
Zostało mi napisać przetwarzacz drzewa wyprowadzenia do docelowej formy (która będzie zapisywana w bazie). Wprowadzenie reszty elementów składniowych będzie mogło zaczekać na późniejszy termin.
Udało mi się znaleźć generator samodzielnych parserów dla Pythona: Wisent. To nie było takie łatwe i oczywiste, prawie wszystkie generatory jakie znalazłem produkują kod, który wymaga ich runtime'u do pracy.