Edycja: Niedawno dowiedziałem się o projekcie o nazwie CommonMark, który poprawnie identyfikuje i radzi sobie z niejasnościami w oryginalnej specyfikacji Markdown. http://commonmark.org/ Ma świetną obsługę bibliotek C #.
Możesz znaleźć składnię tutaj .
Źródło, które następuje wraz z pobieraniem, jest napisane w Perlu , którego nie mam zamiaru szanować. Jest pełen wyrażeń regularnych i opiera się na skrótach MD5, aby uniknąć pewnych znaków. Coś w tym jest nie tak!
Mam zamiar na stałe zakodować parser dla Markdown . Jakie jest z tym doświadczenie?
Jeśli nie masz nic znaczącego do powiedzenia na temat faktycznego analizowania Markdown, oszczędź mi czasu. (Może to zabrzmieć ostro, ale tak, szukam wglądu, a nie rozwiązania, czyli biblioteki innej firmy).
Aby trochę pomóc w odpowiedziach, wyrażenia regularne mają na celu identyfikację wzorców ! NIE analizować całej gramatyki. To, co ludzie rozważają, to foobar.
- Jeśli myślisz o Markdown, zasadniczo opiera się on na koncepcji akapitów.
- W związku z tym rozsądnym podejściem może być podzielenie danych wejściowych na akapity.
- Istnieje wiele rodzajów akapitów, na przykład nagłówek, tekst, lista, cytaty i kod.
- Wyzwaniem jest zatem zidentyfikowanie tych akapitów i ich kontekstu.
Wrócę z rozwiązaniem, gdy uznam, że warto się nim podzielić.
Odpowiedzi:
Jedynym Przecena realizacja wiem, że wykorzystuje rzeczywiste parser, jest Jon MacFarleane „s peg-Przecena . Jego parser jest oparty na generatorze parsera Parsing Expression Grammar o nazwie peg .
EDYCJA: Mauricio Fernandez niedawno wydał swój parser Simple Markup Markdown , który napisał w ramach swojego silnika OcsiBlog Weblog Engine. Ponieważ parser jest napisany w OCaml , jest niezwykle prosty i krótki (268 SLOC dla parsera , 43 SLOC dla emitera HTML ), a jednocześnie niesamowicie szybki (20% szybszy niż dyskonto (napisany ręcznie zoptymalizowanym C) i sześćset razy szybszy niż BlueCloth ( Ruby)), mimo że nie jest jeszcze zoptymalizowany pod kątem wydajności. Ponieważ jest on przeznaczony tylko do użytku wewnętrznego przez samego Mauricio na jego blogu, istnieje kilka odchyleń od oficjalnej specyfikacji Markdown , ale Mauricio stworzył gałąź, która przywraca większość tych zmian .
źródło
W zeszłym tygodniu wypuściłem nową implementację języka Markdown Java opartą na parserze, nazwaną pegdown . pegdown używa parsera PEG, aby najpierw zbudować abstrakcyjne drzewo składni, które jest następnie zapisywane w HTML. Jako taka jest całkiem przejrzysta i dużo łatwiejsza do odczytania, utrzymania i rozszerzenia niż podejście oparte na wyrażeniach regularnych. Gramatyka PEG jest oparta na implementacji "peg-markdown" Johna MacFarlanesa C.
Może coś Cię zainteresuje ...
źródło
Gdybym miał spróbować przeanalizować markdown (i jego rozszerzenie Markdown extra ), myślę, że spróbuję użyć automatu stanowego i przeanalizować go po jednym znaku na raz, łącząc ze sobą niektóre wewnętrzne struktury reprezentujące fragmenty tekstu, gdy idę dalej, raz all jest analizowany, generując wynik z wszystkich obiektów połączonych ze sobą.
Zasadniczo, czytając plik wejściowy, budowałbym drzewo przypominające mini-DOM.
Aby wygenerować wynik, po prostu przeszedłbym przez drzewo i wyprowadził HTML lub cokolwiek innego (PS, LaTex, RTF, ...)
Rzeczy, które mogą zwiększyć złożoność:
Fakt, że możesz mieszać HTML i markdown, chociaż reguła może być łatwa do wdrożenia: po prostu zignoruj wszystko, co znajduje się między dwoma zrównoważonymi tagami i wyślij to dosłownie.
Adresy URL i notatki mogą mieć swoje odniesienia na dole tekstu. Korzystanie ze struktur danych dla hiperłączy może po prostu zarejestrować coś takiego:
Nagłówki można zdefiniować za pomocą podkreślenia, co może zmusić nas do użycia prostej struktury danych dla ogólnego akapitu i zmodyfikowania jego właściwości w trakcie czytania pliku:
W każdym razie, tylko kilka myśli.
Jestem pewien, że jest wiele drobnych szczegółów, którymi należy się zająć i jestem prawie pewien, że Regexes może się przydać podczas tego procesu.
W końcu mieli przetwarzać tekst.
źródło
Prawdopodobnie przeczytałbym specyfikację składni wystarczająco dużo razy, aby ją poznać i zorientować się, jak ją przeanalizować.
Czytanie istniejącego kodu parsera jest oczywiście genialne, zarówno po to, aby zobaczyć, co wydaje się być głównym źródłem złożoności, jak i jeśli zostaną użyte jakieś sprytne sztuczki. Użycie sum kontrolnych MD5 wydaje się nieco dziwne, ale nie przestudiowałem kodu wystarczająco, aby zrozumieć, dlaczego to się robi. Komentarz w procedurze zwanej
_EscapeSpecialChars()
stany:Zastąpienie pojedynczego znaku pełnym MD5 wydaje się ekstrawaganckie, ale być może naprawdę ma sens.
Oczywiście mądrze byłoby rozważyć stworzenie „prawdziwej” składni dla narzędzia takiego jak Flex, aby wydostać się z bagna wyrażeń regularnych.
źródło
Jeśli nie lubisz Perla, istnieją implementacje Markdown w co najmniej 10 innych językach . Prawdopodobnie nie wszystkie mają 100% kompatybilności, ale zwykle są dość blisko.
źródło
MarkdownPapers to kolejna implementacja Java, której parser jest zdefiniowany w gramatyce JavaCC .
źródło
Jeśli używasz języka programowania, który ma więcej niż trzech innych użytkowników, powinieneś być w stanie znaleźć bibliotekę do przeanalizowania go za Ciebie. Szybkie wyszukiwanie w Google ujawnia biblioteki CL, Haskell, Python, JavaScript, Ruby i tak dalej. Jest bardzo mało prawdopodobne, że będziesz musiał wymyślić to koło na nowo.
Jeśli naprawdę musisz napisać go od zera, polecam napisanie odpowiedniego parsera. Dzięki tej technice nie będziesz musiał uciekać przed rzeczami z hasłami MD5. (Zgadzam się, że jeśli musisz zrobić coś takiego, czas ponownie przemyśleć swój projekt).
źródło
Istnieją biblioteki dostępne w wielu językach, w tym php, ruby, java, c #, javascript. Proponuję przyjrzeć się niektórym z nich w poszukiwaniu pomysłów.
Zależy to od tego, jakiego języka chcesz użyć, aby jak najlepiej go zaimplementować, będą istniały idiomatyczne i nieidiomatyczne sposoby na zrobienie tego.
Regeksy działają w perlu, ponieważ perl i regex są najlepszymi przyjaciółmi.
źródło
Markdown to JAWL (kolejny język wiki)
Istnieje wiele stron typu wiki typu open source, na których można sprawdzić kod parsera. Większość używa REGEX
Sprawdź wiki Screwturn, ma interesujący potok formatowania wieloprzebiegowego, bardzo fajną technikę - zobacz /core/Formatter.cs i /core/FormatterPipeline.cs
Najlepiej jest użyć / dołączyć do istniejącego projektu, tego typu rzeczy są zawsze o wiele trudniejsze, niż się wydaje
źródło
Tutaj możesz znaleźć implementację Markdown w JavaScript. Opiera się również w dużej mierze na wyrażeniach regularnych, ponieważ jest to najszybszy i najłatwiejszy sposób przeanalizowania tekstu.
Ale oszczędza część MD5.
Nie mogę pomóc bezpośrednio w kodowaniu parsowania, ale może ten link może ci pomóc w taki czy inny sposób.
źródło