Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

새로운 파서 지원 #106

Open
wkpark opened this issue Dec 30, 2015 · 0 comments
Open

새로운 파서 지원 #106

wkpark opened this issue Dec 30, 2015 · 0 comments
Milestone

Comments

@wkpark
Copy link
Owner

wkpark commented Dec 30, 2015

현재 마크다운 + 모니위키 지원을 계획중입니다.

최근에 마크다운을 표준화하려는 시도가 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같은 경우는 스펙에 너무 세세한 것까지 지정을 해 놓아서 이걸 모두 충족시키는 파서를 쉽게 만드는 것이 어려워 보이지만, 가장 간결한 구현으로 스펙을 보다 손쉽게 충족시킬 만한 방법을 찾아보게 되었습니다.

그 후보로 꼽을 수 있는 것은 도쿠위키 파서인데, SimpleText 프로젝트의 parser.phplexer.php를 가져다가 도쿠위키에 맞게 적용시킨 것입니다. 도쿠위키의 파서 참조.
파서 최초 커밋 2005년 5월 31일

  1. 이 파서는 lexer.php를 통해서 regex로 토큰을 분리하는데, regex 캡쳐를 쓰지 못하고 preg_match의 모든 기능을 제대로 활용하지 못하고 있습니다.
  2. 사실 기능적으로 그 골격은 Parsedown과 크게 다를바가 없습니만, 이벤트+토큰 기반이므로 중첩된 문법을 좀 더 정확히 파싱을 할 수 있습니다.

1.번의 단점을 보완하기 위해서 패턴을 캡쳐할 수 있도록 고치고, 아예 토큰값을 반환하는 것이 아니라 매칭된 $matches를 반환하도록 하였습니다. 반환된 토큰값은 $matches[0]을 쓸 수도 있고, 매칭된 다른 요소를 파서에서 사용하는 것도 가능하여 강력한 regexp 기능을 고스란히 사용할 수 있게 하였습니다.

이를 활용하여 좀 더 정확한 인라인 파서를 만들 계획이며, 이와 별도로 블럭 파서Parsedown의 기능을 그대로 활용하거나 lexer.php를 이용해 다시 만들 계획입니다.

@wkpark wkpark added this to the 1.3.0 milestone Nov 15, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant