IT

Markdown을 파싱하는 방법은 무엇입니까?

lottoking 2020. 7. 12. 09:03
반응형

Markdown을 파싱하는 방법은 무엇입니까? [닫은]


편집 : 최근에 Markdown의 모호성을 보존하고 처리하는 CommonMark라는 프로젝트에 대해 배웠습니다. http://commonmark.org/ C # 라이브러리를 훌륭하게 지원합니다.

구문은 여기에서 사용할 수 있습니다 .

다운로드와 함께 제공되는 소스는 Perl 로 작성되는 것 입니다. 정규 한정으로 가득 차 있고 MD5 해시에 의존하여 특정 문자를 이스케이프합니다. 뭔가 잘못됐다!

Markdown에 대한 파서를 작성하여 코딩 합니다. 이것에 대한 경험은 무엇입니까?

Markdown의 실제 구문에 대해 의미있는 말이 운영되는 시간을 절약하십시오. (즉, 가혹하게 들릴지 모르지만, 즉 라이브러리를 찾고 있습니다).

정답은 패턴광역 하기 위한 것입니다 . 전체 문법을 파싱하지. 사람들이 그렇게 생각하는 것은 바보입니다.

  • Markdown에 대해 생각하면 기본적으로 단락을 기반으로합니다.
  • 따라서 접근 가능한 방식은 입력을 나누는 수 있습니다.
  • 제목, 텍스트, 목록, 인용 부호 및 코드와 같은 많은 종류의 단락이 있습니다.
  • 그것은 절대로 보여지는 것입니다.

판단하면 솔루션 공유로 돌아올 것입니다.


실제 파서 사용하는 유일한 마크 다운 구현은 Jon MacFarleanepeg-markdown 입니다. 파서PEG 라는 구문 분석 문법 문법 파서 생성기 -based으로합니다 .


편집 : Mauricio Fernandez는 최근 자신의 OcsiBlog Weblog Engine의 일부로 쓴 Simple Markup Markdown 파서 발표했습니다 . 파서가 작성된 때문에 OCaml의 의로 , 그것은 인 매우 짧고 간단합니다 (268 SLOC 파서 43 SLOC는 HTML 터 ), 아직 엄청나게 빠른 (20 %보다 빠르게 할인하여하여 (손 최적화 C에 기입) 및 sixhundred 배 빠른 BlueCloth 보다 ( 루비)), 아직 성능에 최적화되지 않은 사실에도 불구하고. Mauricio가 자신의 웹 로그를 위해 내부 용으로 만 사용하기 때문에 공식 Markdown 사양약간의 차이가 있습니다 Mauricio는 자신의 웹 로그를 대부분 되 돌리는 지점을 만들었습니다 .


지난 주 pegdown 이라는 새로운 파서 기반 Markdown Java 구현을 발표했습니다 . pegdown은 PEG 파서를 사용하여 먼저 추상 구문 트리를 작성하며,이 구문 트리는 HTML로 작성됩니다. 따라서 정규식 기반 접근 방식보다 훨씬 깨끗하고 읽기 유지 관리하며 확장됩니다. PEG 문법은 John MacFarlanes C 구현 "페그 마크 다운"을 기반으로합니다.

아마도 당신에게 관심이있는 것 ...


markdown (및 확장명 Markdown extra ) 을 구문 분석 대상 상태 머신을 사용하고 한 번에 한 문자 씩 구문 분석하여 텍스트 비트를 내부 구조를 한 번에 연결하려고합니다. 모두 구문 분석되어 모든 클래스로 묶인 객체를 생성합니다.

기본적으로 입력 된 파일을 읽을 때 미니 DOM과 같은 트리를 작성합니다.
출력을 생성 한 광고 트리를 통과하고 HTML 또는 다른 것을 출력합니다 (PS, LaTex, RTF 등).

추가를 증가시키는 수있는 것들 :

  • 규칙을 구현하기는 쉽지만 HTML과 마크 다운을 혼합 할 수있는 것 사실은 두 개의 개의 개의 균형 잡힌 태그 사이에있는 것입니다.

  • URL 및 메모는 텍스트 하단에 참조가 있습니다. 하이퍼 링크에 데이터 구조를 사용하면 다음과 같이 간단하게 기록 할 수 있습니다.

    [my text to a link][linkkey]
    results in a structure like: 
        URLStructure: 
        |  InnerText : "my text to a link"
        |  Key       : "linkkey"
        |  URL       : <null>
    
  • 머리글은 밑줄로 정의 할 수 있으므로 일반 단락에 간단한 데이터 구조를 사용하고 파일을 읽을 때 해당 속성을 수정해야합니다.

    ParagraphStructure:
    |  InnerText    : the current paragraph text 
    |                 (beginning of line until end of line).
    |  HeadingLevel : <null> or 1-4 when we can assess 
    |                 that paragraph heading level, if any.
    

어쨌든, 약간의 생각.

나는 처리해야 할 세부 사항이 많이 확신하며 절차 중에 Regexes가 가능할 것이라고 확신합니다.
결국, 그들은 텍스트를 처리해야했습니다.


구문 사양을 알기에 충분한 시간을 읽고 구문 분석 방법에 대한 느낌을 얻었을 것입니다.

모든 것의 주요 원인이 무엇인지, 특별한 영리한 트릭이 있는지 확인하는 것이 훌륭합니다. MD5 체크섬을 사용하는 것은 조금 이상해 보이지만, 왜 그렇게 그렇게 이해하는 코드를 연구하고 있습니다. _EscapeSpecialChars()상태 라는 루틴의 주석 :

해당 각 문자를 해당 MD5 ​​체크섬 값으로 바꿉니다. 이 과잉 일 가능성이 우연히 탈출 값과 충돌하는 것을 방지해야합니다.

단일 문자를 전체 MD5로 바꾸는 것은 사치스러운 것처럼 보이지만 실제로는 의미가 있습니다.

물론 플렉스 와 같은 도구 가 정규식 늪지에서 수 있습니다 "진정한"구문 작성을 고려하는 것이 현명합니다 .


Perl이 당신의 것이 아니라면, 10 개의 다른 언어로 Markdown 구현이 있습니다 . 아마 모두 100 % 선호하는 경향이 있습니다.


MarkdownPapers 는 파서가 JavaCC 문법에 정의 된 또 다른 Java 구현입니다 .


php, ruby, java, c #, javascript 등 다양한 언어로 제공되는 라이브러리가 있습니다. 아이디어를 제공하는 상품 중 일부를 보는 것이 좋습니다.

사용하려는 언어에 따라 가장 좋은 구현 방법은 관용적 및 비 관용적 방법이 있습니다.

정규식은 perl에서 작동합니다. perl과 regex는 가장 친한 친구이기 때문입니다.


3 명 이상의 다른 사용자가있는 프로그래밍 언어를 사용하는 경우이를 구문 분석 할 라이브러리를 사용할 수 있습니다. 빠른 Google-ing은 CL, Haskell, Python, JavaScript, Ruby 등의 라이브러리를 보여줍니다. 이 바퀴를 재발 명 할 필요는 거의 없습니다.

처음부터 작성해야한다면 제안하는 것이 좋습니다. 이 기술을 사용하면 MD5 해시로 항목을 이스케이프 할 필요가 없습니다. (이렇게해야한다면 디자인을 재고 할 때라는 데 동의합니다.)


Markdown은 JAWL (다른 위키 언어)입니다.

파서의 코드를 검사 할 수있는 오픈 소스 위키가 많이 있습니다. 대부분 REGEX 사용

screwturn wiki를 확인하세요. 흥미로운 멀티 패스 포맷터 파이프 라인이 있습니다. 매우 멋진 기술입니다. /core/Formatter.cs 및 /core/FormatterPipeline.cs 참조

가장 좋은 기존 기존 프로젝트를 사용 / 참여하는 것입니다. 이런 종류의 작업은 항상 보이는 것보다 훨씬 어렵습니다.


여기 에서 Markdown의 JavaScript 구현을 사용할 수 있습니다. 또한 이것은 텍스트를 구문 분석하는 가장 빠르고 쉬운 방법이기 때문에 정규 자료에 크게 의존합니다.

그러나 그것은 MD5 부분을 아끼지 언어입니다.

구문 분석 코딩에 직접 도움을 줄 수는 없지만 어떤 식 으로든 도움이 될 수 있습니다.

참고 URL : https://stackoverflow.com/questions/605434/how-would-you-go-about-parsing-markdown

반응형

'IT' 카테고리의 다른 글

메시지 브로커와 ESB의 차이점  (0) 2020.07.12
Zookeeper의 실제 사용  (0) 2020.07.12
ContextLoaderListener?  (0) 2020.07.12
크롬의 디버거에서 일시 중지 되었습니까?  (0) 2020.07.11
Vim에서 파일을 여는 단축키  (0) 2020.07.11