flexmark-java는 블록을 먼저 사용하고 Markdown 구문 분석 아키텍처 이후 인라인을 사용하는 CommonMark(사양 0.28) 파서의 Java 구현입니다.
그 강점은 속도, 유연성, 요소와 확장성을 구성하는 어휘소의 개별 문자에 이르기까지 소스 위치에 대한 세부 정보를 포함하는 마크다운 소스 요소 기반 AST입니다.
API를 사용하면 구문 분석 프로세스를 세부적으로 제어할 수 있으며 설치된 다수의 확장 기능을 사용하여 구문 분석하는 데 최적화되어 있습니다. 파서 및 확장에는 파서 동작 및 HTML 렌더링 변형에 대한 다양한 옵션이 제공됩니다. 최종 목표는 파서와 렌더러가 매우 정확하게 다른 파서를 모방할 수 있도록 하는 것입니다. 이제 Markdown 프로세서 에뮬레이션 구현으로 부분적으로 완료되었습니다.
이 프로젝트를 진행하게 된 동기는 JetBrains IDE용 Markdown Navigator 플러그인에서 pegdown 파서를 교체해야 한다는 것이었습니다. pegdown에는 훌륭한 기능 세트가 있지만 일반적으로 속도가 이상적이지 않으며 병리학적 입력의 경우 구문 분석 중에 중단되거나 실제로 중단됩니다.
버전 0.62.2 이하, Java 8 이상, Java 9+ 호환. 버전 0.64.0 이상, Java 11 이상.
프로젝트는 Maven에 있습니다: com.vladsch.flexmark
코어에는 org.jetbrains:annotations:24.0.1
이외의 종속성이 없습니다. 확장에 대해서는 아래 확장 설명을 참조하세요.
API는 새로운 확장과 기능을 수용하기 위해 계속 발전하고 있습니다.
Maven의 경우 다음 샘플에 코어 및 모든 모듈을 포함하는 종속성으로 flexmark-all
추가합니다.
<의존성> <groupId>com.vladsch.flexmark</groupId> <artifactId>flexmark-all</artifactId> <버전>0.64.8</버전> </의존성>
소스: BasicSample.java
패키지 com.vladsch.flexmark.samples;import com.vladsch.flexmark.util.ast.Node;import com.vladsch.flexmark.html.HtmlRenderer;import com.vladsch.flexmark.parser.Parser;import com.vladsch.flexmark .util.data.MutableDataSet;public class BasicSample { public static void main(String[] args) { MutableDataSet 옵션 = 새로운 MutableDataSet(); // 선택적 확장을 설정하려면 주석 처리를 제거합니다. //options.set(Parser.EXTENSIONS, Arrays.asList(TablesExtension.create(), StrikethroughExtension.create())); // 소프트 브레이크를 하드 브레이크로 변환하려면 주석 처리를 제거합니다. //options.set(HtmlRenderer.SOFT_BREAK, "<br />n"); 파서 파서 = Parser.builder(options).build(); HtmlRenderer 렌더러 = HtmlRenderer.builder(options).build(); // 파서 및 렌더러 인스턴스를 재사용할 수 있습니다. Node document =parser.parse("This is *Sparta*"); 문자열 html = renderer.render(document); // "<p>여기는 <em>스파르타</em></p>입니다n" System.out.println(html); } }
구현 'com.vladsch.flexmark:flexmark-all:0.64.8'
중복 파일로 인한 추가 설정:
포장 옵션 { 'META-INF/LICENSE-LGPL-2.1.txt' 제외 'META-INF/LICENSE-LGPL-3.txt' 제외 'META-INF/LICENSE-W3C-TEST' 제외 'META-INF/DEPENDENCIES' 제외}
자세한 내용은 다음 문서에서 확인할 수 있습니다.
Wiki 홈 사용 예 확장 세부 사항 확장 작성
PegdownOptionsAdapter
클래스는 pegdown Extensions.*
플래그를 flexmark 옵션 및 확장 목록으로 변환합니다. Pegdown Extensions.java
는 편의를 위해 포함되었으며 pegdown 1.6.0에는 없는 새로운 옵션도 포함되어 있습니다. 이는 flexmark-profile-pegdown
모듈에 있지만 이 저장소(PegdownOptionsAdapter.java, Extensions.java)에서 소스를 가져와서 프로젝트 요구 사항에 맞게 수정된 자신만의 버전을 만들 수 있습니다.
확장 플래그를 정적 PegdownOptionsAdapter.flexmarkOptions(int)
에 전달하거나 PegdownOptionsAdapter
인스턴스화하고 편의 메서드를 사용하여 확장 플래그를 설정, 추가 및 제거할 수 있습니다. PegdownOptionsAdapter.getFlexmarkOptions()
페그다운 확장 플래그를 반영하는 옵션을 사용하여 매번 DataHolder
의 새로운 복사본을 반환합니다.
import com.vladsch.flexmark.html.HtmlRenderer;import com.vladsch.flexmark.parser.Parser;import com.vladsch.flexmark.profile.pegdown.Extensions;import com.vladsch.flexmark.profile.pegdown.PegdownOptionsAdapter;import com .vladsch.flexmark.util.data.DataHolder;public class PegdownOptions { final private static DataHolder OPTIONS = PegdownOptionsAdapter.flexmarkOptions( Extensions.ALL ); 정적 최종 파서 PARSER = Parser.builder(OPTIONS).build(); static final HtmlRenderer RENDERER = HtmlRenderer.builder(OPTIONS).build(); // PARSER를 사용하여 구문 분석하고 RENDERER를 사용하여 페그다운 호환성으로 렌더링합니다.}
기본 flexmark-java 페그다운 에뮬레이션은 빈 줄에서 HTML 블록을 중단시키는 덜 엄격한 HTML 블록 구문 분석을 사용합니다. Pegdown은 HTML 블록의 모든 태그가 닫힌 경우에만 빈 줄에서 HTML 블록을 중단합니다.
원래의 페그다운 HTML 블록 구문 분석 동작에 더 가까워지려면 boolean strictHtml
인수를 사용하는 메서드를 사용하세요.
import com.vladsch.flexmark.html.HtmlRenderer;import com.vladsch.flexmark.parser.Parser;import com.vladsch.flexmark.profile.pegdown.Extensions;import com.vladsch.flexmark.profile.pegdown.PegdownOptionsAdapter;import com .vladsch.flexmark.util.data.DataHolder;public class PegdownOptions { final private static DataHolder OPTIONS = PegdownOptionsAdapter.flexmarkOptions(true, Extensions.ALL ); 정적 최종 파서 PARSER = Parser.builder(OPTIONS).build(); static final HtmlRenderer RENDERER = HtmlRenderer.builder(OPTIONS).build(); // PARSER를 사용하여 구문 분석하고 RENDERER를 사용하여 페그다운 호환성으로 렌더링합니다.}
사용자 정의 링크 분석기가 포함된 샘플도 사용할 수 있습니다. 여기에는 생성된 링크 HTML을 재정의해야 하는 경우 URL 또는 링크 속성을 변경하기 위한 링크 분석기와 사용자 정의 노드 렌더러가 포함되어 있습니다.
flexmark-java에는 pegdown 1.6.0에서 사용할 수 있는 확장 기능 외에도 pegdown보다 더 많은 확장 기능과 구성 옵션이 있습니다. PegdownOptionsAdapter를 통해 사용 가능한 확장
버전 0.60.0의 구현에 대한 주요 재구성 및 코드 정리(버전 0.60.0-변경 참조) Alex Karezin의 훌륭한 작업 덕분에 패키지 및 클래스로 드릴다운하는 기능을 통해 모듈 종속성에 대한 개요를 얻을 수 있습니다.
여러 마크다운 문서를 단일 문서로 병합하는 병합 API입니다.
Docx 렌더러 확장: 제한된 속성 노드 처리
확장 가능한 HTML-Markdown 변환기 모듈: flexmark-html2md-converter. 샘플: HtmlToMarkdownCustomizedSample.java
Java9+ 모듈 호환성
복합 열거 참조 열거 참조 요소 및 표제에 대한 법적 번호 매기기를 생성하기 위한 확장입니다.
임의의 마크다운 콘텐츠를 블록 또는 인라인 요소로 삽입할 수 있도록 하는 매크로 확장으로, 구문에서 인라인 요소만 허용되는 경우 블록 요소를 사용할 수 있습니다.
GitLab 마크다운 확장을 구문 분석하고 렌더링하기 위한 GitLab Flavored Markdown.
OSGi 모듈 제공: Dan Klco(GitHub @klcodanr)
미디어 태그 미디어 링크 변환기 확장 기능 제공: Cornelia Schultz(GitHub @CorneliaXaos)는 사용자 정의 접두사를 사용하여 링크를 오디오, 포함, 그림 및 비디오 HTML5 태그로 변환합니다.
마크다운 문서를 더 쉽게 번역할 수 있는 번역 도우미 API입니다.
훈계 블록 스타일의 사이드 콘텐츠를 만들려면. 전체 문서를 보려면 Admonition Extension, MkDocs 문서 자료를 참조하세요.
그림, 표 및 기타 마크다운 요소에 대한 열거 참조를 생성하는 열거 참조.
{name name=value name='value' name="value" #id .class-name}
속성 형식의 속성을 구문 분석하는 속성입니다.
Vyacheslav N. Boyko(GitHub @bvn13) 덕분에 YouTube Embedded Link Transformer는 YouTube 비디오에 대한 간단한 링크를 임베디드 비디오 iframe HTML로 변환합니다.
docx4j 라이브러리를 사용하는 Docx 변환기. 사용 방법: DocxConverter 샘플, 사용자 정의 방법: Docx 렌더링 사용자 정의
이 모듈의 개발은 Johner Institut GmbH의 후원을 받았습니다.
CommonMark(사양 0.28)와 호환되도록 라이브러리를 업데이트하고 특정 사양 버전 옵션을 선택할 수 있도록 ParserEmulationProfile.COMMONMARK_0_27
및 ParserEmulationProfile.COMMONMARK_0_28
을 추가하세요.
재정의된 노드에 대해 표준 렌더링을 호출하는 기능이 있는 사용자 정의 노드 렌더링 API로, 특별한 경우만 처리하고 나머지는 평소대로 렌더링할 수 있는 사용자 정의 노드 렌더링을 허용합니다. 사용자 정의 링크 확인자
각각 #123
및 @user-name
구문 분석 및 렌더링을 위한 Gfm-Issues 및 Gfm-Users 확장입니다.
다른 태그 뒤에 오는 원시 텍스트 태그를 더 효과적으로 처리하고 페그다운 HTML 블록 구문 분석 호환성을 위한 심층 HTML 블록 구문 분석 옵션입니다.
코어, 모든 확장, 포맷터, JIRA 및 YouTrack 변환기, 페그다운 프로필 모듈, HTML에서 Markdown으로의 변환을 포함하는 flexmark-all
모듈.
PDF 출력 모듈 Open HTML To PDF를 사용하여 PDF 출력
활자체 구현
XWiki 매크로 확장
지킬 태그
HTML을 마크다운으로
Maven 마크다운 페이지 생성기 플러그인
서식 옵션을 사용하여 AST를 마크다운으로 출력하는 마크다운 포맷터 모듈입니다.
열 너비와 마크다운 테이블 정렬이 포함된 마크다운 포맷터용 테이블:
입력 | 산출 |
---|---|
day|time|spent :---|:---:|--: nov. 2. tue|10:00|4h 40m nov. 3. thu|11:00|4h nov. 7. mon|10:20|4h 20m total:|| 13h | | day | time | spent | |:------------|:-----:|--------:| | nov. 2. tue | 10:00 | 4h 40m | | nov. 3. thu | 11:00 | 4h | | nov. 7. mon | 10:20 | 4h 20m | | total: || 13h | |
저는 JetBrains IDE용 Markdown Navigator 플러그인의 파서로 flexmark-java를 사용합니다. 나는 버그를 수정하거나 개선하기 위해 아직 출시되지 않은 최신 버전을 사용하는 경향이 있습니다. 따라서 프로젝트에 방해가 되는 버그를 발견하거나 Github 문제 페이지에서 프로젝트에 영향을 미치는 fixed for next release
것으로 표시된 버그를 본 경우 알려주시면 즉시 해결하기 위한 새 릴리스를 만들 수 있습니다. 당신의 문제. 그렇지 않으면 이미 수정된 내용으로 인해 아무도 영향을 받지 않을 것이라고 생각하여 버그 수정 및 개선 사항을 축적하도록 하겠습니다.
API에는 용도에 따라 다양한 확장 옵션이 있습니다. 좋은 소프트 스타트는 확장 요청에 대한 간단한 샘플이 있는 flexmark-java-samples
모듈입니다. 다음으로 가장 좋은 장소는 추가하려는 것과 유사한 구문을 가진 기존 확장의 소스입니다.
확장 프로그램이 올바른 API와 일치하면 작업은 일반적으로 매우 짧고 간단합니다. 확장 프로그램이 의도하지 않은 방식으로 API를 사용하거나 예상되는 하우스키핑 프로토콜을 따르지 않는 경우 if/else 조건을 처리하고 하나의 버그만 수정하면 또 다른 버그가 생성되는 쥐새끼와의 힘든 싸움을 발견할 수 있습니다.
일반적으로 간단한 확장을 추가하는 데 수십 줄 이상이 소요된다면 잘못 진행했거나 API에 확장 지점이 누락된 것입니다. 구현된 모든 확장을 살펴보면 대부분이 API에 의해 지시된 보일러 플레이트 이외의 몇 줄의 코드라는 것을 알 수 있습니다. 이것이 이 라이브러리의 목표입니다. 확장 기능을 쉽게 작성할 수 있는 확장 가능한 코어를 제공하는 것입니다.
더 큰 확장은 flexmark-ext-tables
및 flexmark-ext-spec-example
이며, 둘 다 약 200줄의 코드입니다. 확장 크기를 추정하기 위한 가이드 포스트로 사용할 수 있습니다.
확장 기능을 추가하는 내 경험에 따르면 새로운 유형의 확장 기능은 구현을 원활하게 하기 위해 API 향상을 사용하거나 확장 기능이 API에 올바른 방식으로 스트레스를 주기 전에는 보이지 않았던 버그를 수정하는 것이 가장 좋습니다. 의도한 확장은 그러한 접근 방식이 필요한 확장일 수도 있습니다.
요점은 다음과 같습니다. 확장 기능이나 기능을 구현하고 싶다면 주저하지 말고 문제를 열어주세요. 최선의 방법에 대한 조언을 드리겠습니다. 귀하가 성과 없는 노력을 많이 하기 전에 확장 기능의 요구 사항을 해결하기 위해 API를 개선할 수 있게 함으로써 많은 시간을 절약할 수 있습니다.
나는 Vulcan Mind Melding 기술이 전혀 없이 이 프로젝트의 수석 요리사이자 병 세척자라는 것을 알아주셨으면 합니다. 나는 당신의 마음을 읽을 수 없기 때문에 구현하고 싶은 것이 무엇인지 설명해달라고 요청합니다. 여러분의 자발적인 노력 없이는 제가 아는 정보를 여러분에게 전달할 수 없으므로 소스 코드와 문서에 대한 조사 배경 작업을 수행하십시오.
상용 애플리케이션이 있고 확장 기능을 직접 작성하고 싶지 않거나 확장 기능 구현 및 flexmark-java 통합에 드는 시간과 노력을 줄이고 싶다면 언제든지 저에게 연락해 주세요. 컨설팅/계약 방식으로 이용 가능합니다.
이름에도 불구하고 commonmark는 상위 집합도 아니고 다른 마크다운 버전의 하위 집합도 아닙니다. 오히려 원본 "핵심" Markdown에 대한 표준적이고 명확한 구문 사양을 제안하여 또 다른 특징을 효과적으로 도입합니다. flexmark는 기본적으로 commonmark와 호환되지만 해당 파서는 다양한 방식으로 조정할 수 있습니다. 가장 일반적으로 사용되는 마크다운 파서를 에뮬레이트하는 데 필요한 조정 세트는 Flexmark에서 ParserEmulationProfiles
로 사용할 수 있습니다.
ParserEmulationProfile
이라는 이름에서 알 수 있듯이 특정 마크다운 방식에 맞게 조정되는 것은 파서뿐입니다. 프로파일을 적용해도 Commonmark에서 사용할 수 있는 기능 이외의 기능은 추가되지 않습니다. flexmark를 사용하여 다른 마크다운 프로세서의 동작을 완전히 에뮬레이트하려면 파서를 조정하고 에뮬레이트하려는 파서에서 사용할 수 있는 추가 기능을 제공하는 flexmark 확장을 구성해야 합니다.
마크다운 프로세서 에뮬레이션에 따라 다른 마크다운 프로세서의 에뮬레이션을 더 효과적으로 제어하기 위해 목록 파서를 다시 작성했습니다. 이러한 파서의 특정 마크다운 처리 동작을 에뮬레이션하기 위한 프로세서 사전 설정 추가는 짧은 할 일 목록에 있습니다.
일부 에뮬레이션 제품군은 다른 에뮬레이션 제품군보다 대상을 더 잘 에뮬레이트합니다. 대부분의 노력은 이러한 프로세서가 표준 마크다운을 구문 분석하고 목록 관련 구문 분석을 구체적으로 수행하는 방법을 에뮬레이트하는 데 집중되었습니다. 원본 Markdown을 확장하는 프로세서의 경우 flexmark-java에 이미 구현된 확장을 Parser/Renderer 빌더 옵션에 추가해야 합니다.
해당 프로세서에 동등한 확장이 구현된 경우 특정 프로세서 에뮬레이션에 대한 자체 사전 설정을 포함하도록 확장이 수정됩니다.
불일치를 발견하면 해결할 수 있도록 문제를 열어주세요.
주요 프로세서 제품군이 구현되었으며 일부 제품군 구성원도 다음과 같습니다.
지킬
최신 구현 사양을 위한 CommonMark, 현재 CommonMark(사양 0.28)
리그/커먼마크
특정 버전 호환성을 위한 CommonMark(사양 0.27)
특정 버전 호환성을 위한 CommonMark(사양 0.28)
GitHub 댓글
Markdown.pl
PHP 마크다운 엑스트라
GitHub Docs(이전 GitHub 마크다운 파서)
크램다운
고정 들여쓰기
멀티마크다운
페그다운
제품군 내의 변형에 대한 구성 세부 정보를 캡슐화하는 프로필이 0.11.0에 추가되었습니다.
CommonMark(패밀리의 기본값): ParserEmulationProfile.COMMONMARK
FixIndent(패밀리의 기본값): ParserEmulationProfile.FIXED_INDENT
GitHub 댓글(CommonMark만 해당): ParserEmulationProfile.COMMONMARK
이전 GitHub 문서: ParserEmulationProfile.GITHUB_DOC
Kramdown(패밀리의 기본값): ParserEmulationProfile.KRAMDOWN
Markdown.pl(패밀리의 기본값): ParserEmulationProfile.MARKDOWN
멀티마크다운: ParserEmulationProfile.MULTI_MARKDOWN
Pegdown 확장 기능이 있는 Pegdown은 flexmark-profile-pegdown
의 PegdownOptionsAdapter
사용합니다.
페그다운(페그다운 확장 없음) ParserEmulationProfile.PEGDOWN
페그다운 확장이 없는 페그다운 HTML 블록 구문 분석 규칙 ParserEmulationProfile.PEGDOWN_STRICT
flexmark-java는 원본 소스의 모든 요소를 반영하는 AST를 생성하고 AST의 모든 요소에 대한 전체 소스 위치 추적 및 JetBrains Open API PsiTree 생성을 더 쉽게 생성하도록 수정된 commonmark-java 프로젝트의 포크입니다.
API는 구문 분석 프로세스를 보다 세밀하게 제어할 수 있도록 변경되었으며 다수의 확장 기능이 설치된 구문 분석에 최적화되었습니다. 파서 및 확장에는 파서 동작 및 HTML 렌더링 변형에 대한 다양한 조정 옵션이 제공됩니다. 최종 목표는 파서와 렌더러가 매우 정확하게 다른 파서를 모방할 수 있도록 하는 것입니다.
이에 대한 동기는 Markdown Navigator 플러그인의 pegdown 파서를 대체해야 한다는 것이었습니다. pegdown에는 훌륭한 기능 세트가 있지만 일반적으로 속도가 이상적이지 않으며 병리학적 입력의 경우 구문 분석 중에 중단되거나 실제로 중단됩니다.
commonmark-java는 이해하고 확장하기 쉬운 뛰어난 구문 분석 아키텍처를 갖추고 있습니다. 목표는 AST에 소스 위치 추적을 추가해도 꼭 필요한 것 이상으로 AST 구문 분석 및 생성의 용이성이 변경되지 않도록 하는 것이었습니다.
commonmark-java를 파서로 선택하는 이유는 속도, 이해 용이성, 확장 용이성 및 속도입니다. 이제 핵심을 재작업하고 몇 가지 확장을 추가했으므로 내 선택에 매우 만족합니다.
또 다른 목표는 확장 메커니즘을 통해 마크다운의 모든 방언을 구현할 수 있도록 파서 동작을 수정하는 확장 기능을 개선하는 것이었습니다. 모든 옵션을 한 곳에서 설정할 수 있도록 확장 가능한 옵션 API가 추가되었습니다. 파서, 렌더러 및 확장은 일부 핵심 블록 파서 비활성화를 포함하여 구성에 이러한 옵션을 사용합니다.
이는 많은 API 변경이 진행 중인 작업입니다. 원래 프로젝트에 대한 이전 버전 API 호환성을 유지하려는 시도는 없으며 기능 세트가 대부분 완료될 때까지 이 프로젝트의 이전 버전에도 적용되지 않습니다.
특징 | flexmark-java | commonmark-java | 페그다운 |
---|---|---|---|
상대 구문 분석 시간(적을수록 좋음) | 1x (1) | 0.6x ~ 0.7x (2) | 병리학적 입력의 경우 평균 25배, 20,000x~무한대(3) |
AST의 모든 소스 요소 | |||
소스 위치가 있는 AST 요소 | 약간의 오류와 특이점이 있음 | ||
AST는 쉽게 조작 가능 | AST 사후 처리는 확장 메커니즘입니다. | AST 사후 처리는 확장 메커니즘입니다. | 옵션이 아닙니다. 노드의 상위 정보가 없으며 하위는 List<>입니다. |
AST 요소에는 모든 부품에 대한 자세한 소스 위치가 있습니다. | 노드 시작/끝만 | ||
핵심 구문 분석 기능을 비활성화할 수 있습니다. | |||
확장 API를 통해 구현된 핵심 파서 | 특정 블록 파서 및 노드 클래스에 대한 instanceOf 테스트 | 코어는 몇 가지 확장 지점을 노출합니다. | |
파서 구현을 이해하고 수정하기 쉽습니다. | 복잡한 상호작용이 있는 하나의 PEG 파서(3) | ||
블록 요소의 구문 분석은 서로 독립적입니다. | 하나의 PEG 문법에 모든 것이 들어있습니다 | ||
파서, 렌더러 및 모든 확장에 걸쳐 균일한 구성 | 확장자 목록 외에는 없음 | 코어용 int 비트 플래그, 확장용 비트 플래그 없음 | |
확장과 함께 사용하도록 최적화된 구문 분석 성능 | 코어에 대한 성능 분석, 확장 기능은 가능한 모든 작업을 수행합니다. | 성능은 특징이 아니다 | |
즉시 사용 가능한 다양한 구성 옵션과 확장 기능을 갖춘 풍부한 기능 | 제한된 확장, 옵션 없음 | ||
올바른 처리 순서를 보장하기 위한 프로세서에 대한 종속성 정의 | 확장 목록 순서로 지정된 순서, 오류가 발생하기 쉬움 | 해당 없음, 코어는 확장 처리가 추가되는 위치를 정의합니다. |
flexmark-java 병리학적 입력 100,000개 [
68ms에 구문 분석, 100,000 ]
57ms에, 100,000 중첩된 [
]
구문 분석 55ms에
commonmark-java 병리학적 입력 100,000개 [
30ms에 구문 분석, 100,000 ]
30ms에, 100,000 중첩된 [
]
구문 분석 43ms에
17의 페그다운 병리학적 입력은 650ms에 [
분석되고, 18 [
1300ms에 분석됩니다.
파서 옵션, 작업 항목으로 표시된 항목은 나머지가 완료되도록 구현됩니다.
수동 느슨한 목록
번호가 매겨진 목록은 항상 1로 시작합니다.
고정 목록 항목 들여쓰기, 항목은 최소 4개의 공백으로 들여쓰기되어야 합니다.
완화된 목록 시작 옵션으로, 앞에 빈 줄이 없을 때 목록이 시작되도록 허용합니다.
지킬 서문
{% include file %}
, Markdown 및 HTML 파일 콘텐츠 포함을 지원하는 Jekyll 태그 요소
GitBook 링크 URL 인코딩. 해당 없음
HTML 주석 노드: 블록 및 인라인
여러 줄 이미지 URL
사양 예시 요소
인라인 HTML: 모두, 비주석, 주석
HTML 블록: 모두, 비주석, 주석
약어
각주
정의
목차
취소선
작업 목록
ATX 헤더 공간 없음
헤더 들여쓰기 없음
하드 랩(SOFT_BREAK 옵션을 "<br />"
로 변경하여 달성)
완화된 HR 규칙 옵션
위키 링크
울타리 코드 블록
자동 ID 생성 기능이 있는 헤더의 앵커 링크
테이블 확장을 위해 구현될 테이블 범위 옵션
GitHub 및 Creole 구문이 포함된 Wiki 링크
GitHub 이모티콘 URL 옵션을 사용하는 이모티콘 바로가기
인용 부호
스마트
인쇄상의
GitHub 확장
GitHub 구문
출판
막다
프로세서 확장
Commonmark 구문 억제
나는 내 프로젝트를 commonmark-java 기반 파서로 전환하기로 한 결정에 매우 만족합니다. 완전한 소스 위치 추적과 소스 요소와 일치하는 AST를 얻기 위해 내부에 대대적인 수술을 해야 했지만, 작업하는 것이 즐겁고 이제는 확장하는 것도 즐겁습니다. 소스 수준 요소 AST 또는 flexmark-java에 추가된 나머지 요소가 필요하지 않고 CommonMark가 대상 마크다운 파서인 경우 commonmark-java를 사용하는 것이 좋습니다. 이는 요구 사항에 탁월한 선택이고 성능이 저하되지 않기 때문입니다. 사용하지 않을 기능의 오버헤드를 위해.
최신, 2017년 1월 28일 flexmark-java 0.13.1, CE EAP 2017의 intellij-markdown, commonmark-java 0.8.0:
파일 | commonmark-java | flexmark-java | Intellij-마크다운 | 페그다운 |
---|---|---|---|---|
읽어보기-SLOW | 0.420ms | 0.812ms | 2.027ms | 15.483ms |
버전 | 0.743ms | 1.425ms | 4.057ms | 42.936ms |
공통마크사양 | 31.025ms | 44.465ms | 600.654ms | 575.131ms |
markdown_example | 8.490ms | 10.502ms | 223.593ms | 983.640ms |
투기 | 4.719ms | 6.249ms | 35.883ms | 307.176ms |
테이블 | 0.229ms | 0.623ms | 0.800ms | 3.642ms |
테이블 형식 | 1.385ms | 2.881ms | 4.150ms | 23.592ms |
포장하다 | 3.804ms | 4.589ms | 16.609ms | 86.383ms |
위의 비율:
파일 | commonmark-java | flexmark-java | Intellij-마크다운 | 페그다운 |
---|---|---|---|---|
읽어보기-SLOW | 1.00 | 1.93 | 4.83 | 36.88 |
버전 | 1.00 | 1.92 | 5.46 | 57.78 |
공통마크사양 | 1.00 | 1.43 | 19.36 | 18.54 |
markdown_example | 1.00 | 1.24 | 26.34 | 115.86 |
투기 | 1.00 | 1.32 | 7.60 | 65.09 |
테이블 | 1.00 | 2.72 | 3.49 | 15.90 |
테이블 형식 | 1.00 | 2.08 | 3.00 | 17.03 |
포장하다 | 1.00 | 1.21 | 4.37 | 22.71 |
전반적인 | 1.00 | 1.41 | 17.47 | 40.11 |
파일 | commonmark-java | flexmark-java | Intellij-마크다운 | 페그다운 |
---|---|---|---|---|
읽어보기-SLOW | 0.52 | 1.00 | 2.50 | 19.07 |
버전 | 0.52 | 1.00 | 2.85 | 12.30 |
공통마크사양 | 0.70 | 1.00 | 13.51 | 12.93 |
markdown_example | 0.81 | 1.00 | 21.29 | 93.66 |
투기 | 0.76 | 1.00 | 5.74 | 49.15 |
테이블 | 0.37 | 1.00 | 1.28 | 5.85 |
테이블 형식 | 0.48 | 1.00 | 1.44 | 8.19 |
포장하다 | 0.83 | 1.00 | 3.62 | 18.83 |
전반적인 | 0.71 | 1.00 | 12.41 | 28.48 |
이 두 파일은 페그다운에 대한 병리학적 입력을 나타내기 때문에 결과 왜곡을 방지하기 위해 더 이상 벤치마크의 일부로 실행하지 않습니다. 결과는 후손을 위해 여기에 있습니다.
파일 | commonmark-java | flexmark-java | Intellij-마크다운 | 페그다운 |
---|---|---|---|---|
행 페그다운 | 0.082ms | 0.326ms | 0.342ms | 659.138ms |
hang-pegdown2 | 0.048ms | 0.235ms | 0.198ms | 1312.944ms |
위의 비율:
파일 | commonmark-java | flexmark-java | Intellij-마크다운 | 페그다운 |
---|---|---|---|---|
행 페그다운 | 1.00 | 3.98 | 4.17 | 8048.38 |
hang-pegdown2 | 1.00 | 4.86 | 4.10 | 27207.32 |
전반적인 | 1.00 | 4.30 | 4.15 | 15151.91 |
파일 | commonmark-java | flexmark-java | Intellij-마크다운 | 페그다운 |
---|---|---|---|---|
행 페그다운 | 0.25 | 1.00 | 1.05 | 2024.27 |
hang-pegdown2 | 0.21 | 1.00 | 0.84 | 5594.73 |
전반적인 | 0.23 | 1.00 | 0.96 | 3519.73 |
VERSION.md는 Markdown Navigator에 사용하는 버전 로그 파일입니다.
commonMarkSpec.md는 성능 평가를 위해 intellij-markdown 테스트 제품군에서 사용되는 33k 라인 파일입니다.
spec.txt commonmark-java 프로젝트의 commonmark 사양 마크다운 파일
hang-pegdown.md는 17자로 구성된 단일 라인을 포함하는 파일입니다 [[[[[[[[[[[[[[[[[
이로 인해 pegdown이 초지수 구문 분석 시간에 들어가게 됩니다.
hang-pegdown2.md 18자로 된 한 줄의 파일입니다 [[[[[[[[[[[[[[[[[[
이로 인해 페그다운이 초지수 구문 분석 시간에 들어가게 됩니다.
Wrap.md는 타이핑 성능에 대한 래핑을 테스트하기 위해 사용하던 파일인데, 파일을 구문 분석하는 데 페그다운이 0.1초가 걸렸을 때 코드 타이핑에 대한 래핑과 아무 관련이 없다는 사실을 발견했습니다. 플러그인에서는 구문 강조 표시 패스, psi 트리 구축 패스, 외부 주석자 등 구문 분석이 두 번 이상 발생할 수 있습니다.
markdown_example.md 500kB 이상의 텍스트를 포함하는 10,000줄 이상의 파일입니다.
풀 요청, 이슈 및 의견을 환영합니다. 풀 요청의 경우:
ast_spec.md 형식으로 새로운 기능 및 버그 수정에 대한 테스트를 추가하세요.
가능한 한 쉽게 병합할 수 있도록 기존 스타일을 따릅니다. 4개의 공백 들여쓰기, 후행 공백이 잘립니다.
저작권 (c) 2015-2016 Atlassian 및 기타.
저작권 (c) 2016-2023, 블라디미르 슈나이더,
BSD(2절) 라이센스가 부여되었습니다. LICENSE.txt 파일을 참조하십시오.