You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
최근에 마크다운을 표준화하려는 시도가 CommonMark를 통해 있었고 이를 통해서 MixDown의 기반이 된 Parsedown을 테스트해보니 Parsedown의 방식으로는 명확하게 스펙을 충족시키기 어려운 구조더군요.
예를 들어
foo bar '''dot `com'''` foo bar'''
등과 같이 문법이 중첩이 된 경우 이를 정확히 파싱하지 못합니다.
또한 이러한 문제는 Parsedown만 있는게 아니더군요. BabelMark2를 통해 테스트해보면 파서의 구현 차이로 인해서 조금씩 랜더링이 다르게 되고 있습니다. 예를 들어서 위의 모니위키 문법을 마크다운식으로 사용한 다음의 문법은 깃허브에서 이상하게 랜더링 되고 있습니다.
foo bar **dot `com**foo` foo bar**
결과)
foo bar dot com**foo foo bar
CommonMark같은 경우는 스펙에 너무 세세한 것까지 지정을 해 놓아서 이걸 모두 충족시키는 파서를 쉽게 만드는 것이 어려워 보이지만, 가장 간결한 구현으로 스펙을 보다 손쉽게 충족시킬 만한 방법을 찾아보게 되었습니다.
이 파서는 lexer.php를 통해서 regex로 토큰을 분리하는데, regex 캡쳐를 쓰지 못하고 preg_match의 모든 기능을 제대로 활용하지 못하고 있습니다.
사실 기능적으로 그 골격은 Parsedown과 크게 다를바가 없습니만, 이벤트+토큰 기반이므로 중첩된 문법을 좀 더 정확히 파싱을 할 수 있습니다.
1.번의 단점을 보완하기 위해서 패턴을 캡쳐할 수 있도록 고치고, 아예 토큰값을 반환하는 것이 아니라 매칭된 $matches를 반환하도록 하였습니다. 반환된 토큰값은 $matches[0]을 쓸 수도 있고, 매칭된 다른 요소를 파서에서 사용하는 것도 가능하여 강력한 regexp 기능을 고스란히 사용할 수 있게 하였습니다.
이를 활용하여 좀 더 정확한 인라인 파서를 만들 계획이며, 이와 별도로 블럭 파서는 Parsedown의 기능을 그대로 활용하거나 lexer.php를 이용해 다시 만들 계획입니다.
The text was updated successfully, but these errors were encountered:
현재 마크다운 + 모니위키 지원을 계획중입니다.
최근에 마크다운을 표준화하려는 시도가 CommonMark를 통해 있었고 이를 통해서 MixDown의 기반이 된 Parsedown을 테스트해보니 Parsedown의 방식으로는 명확하게 스펙을 충족시키기 어려운 구조더군요.
예를 들어
등과 같이 문법이 중첩이 된 경우 이를 정확히 파싱하지 못합니다.
또한 이러한 문제는 Parsedown만 있는게 아니더군요. BabelMark2를 통해 테스트해보면 파서의 구현 차이로 인해서 조금씩 랜더링이 다르게 되고 있습니다. 예를 들어서 위의 모니위키 문법을 마크다운식으로 사용한 다음의 문법은 깃허브에서 이상하게 랜더링 되고 있습니다.
결과)
CommonMark같은 경우는 스펙에 너무 세세한 것까지 지정을 해 놓아서 이걸 모두 충족시키는 파서를 쉽게 만드는 것이 어려워 보이지만, 가장 간결한 구현으로 스펙을 보다 손쉽게 충족시킬 만한 방법을 찾아보게 되었습니다.
그 후보로 꼽을 수 있는 것은 도쿠위키 파서인데, SimpleText 프로젝트의
parser.php
및lexer.php
를 가져다가 도쿠위키에 맞게 적용시킨 것입니다. 도쿠위키의 파서 참조.파서 최초 커밋 2005년 5월 31일
lexer.php
를 통해서 regex로 토큰을 분리하는데, regex 캡쳐를 쓰지 못하고preg_match
의 모든 기능을 제대로 활용하지 못하고 있습니다.Parsedown
과 크게 다를바가 없습니만, 이벤트+토큰 기반이므로 중첩된 문법을 좀 더 정확히 파싱을 할 수 있습니다.1.번의 단점을 보완하기 위해서 패턴을 캡쳐할 수 있도록 고치고, 아예 토큰값을 반환하는 것이 아니라 매칭된
$matches
를 반환하도록 하였습니다. 반환된 토큰값은$matches[0]
을 쓸 수도 있고, 매칭된 다른 요소를 파서에서 사용하는 것도 가능하여 강력한 regexp 기능을 고스란히 사용할 수 있게 하였습니다.이를 활용하여 좀 더 정확한 인라인 파서를 만들 계획이며, 이와 별도로 블럭 파서는
Parsedown
의 기능을 그대로 활용하거나lexer.php
를 이용해 다시 만들 계획입니다.The text was updated successfully, but these errors were encountered: