flexmark-java เป็นการใช้งาน Java ของตัวแยกวิเคราะห์ CommonMark (spec 0.28) โดยใช้บล็อกก่อน อินไลน์หลังจากสถาปัตยกรรมการแยกวิเคราะห์ Markdown
จุดแข็งของมันคือความเร็ว ความยืดหยุ่น องค์ประกอบแหล่งที่มาของ Markdown ที่ใช้ AST พร้อมรายละเอียดของตำแหน่งแหล่งที่มาจนถึงอักขระแต่ละตัวของคำศัพท์ที่ประกอบเป็นองค์ประกอบและความสามารถในการขยาย
API ช่วยให้สามารถควบคุมกระบวนการแยกวิเคราะห์ได้อย่างละเอียดและได้รับการปรับให้เหมาะสมสำหรับการแยกวิเคราะห์ด้วยส่วนขยายที่ติดตั้งจำนวนมาก ตัวแยกวิเคราะห์และส่วนขยายมาพร้อมกับตัวเลือกมากมายสำหรับพฤติกรรมของตัวแยกวิเคราะห์และรูปแบบการแสดงผล HTML เป้าหมายสุดท้ายคือการให้ parser และ renderer สามารถเลียนแบบ parsers อื่นๆ ได้อย่างแม่นยำในระดับสูงสุด ขณะนี้ได้ดำเนินการเสร็จสิ้นแล้วบางส่วนด้วยการใช้การจำลองตัวประมวลผล Markdown
แรงจูงใจสำหรับโปรเจ็กต์นี้คือความจำเป็นในการแทนที่ตัวแยกวิเคราะห์ pegdown ในปลั๊กอิน Markdown Navigator ของฉันสำหรับ JetBrains IDE 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-ทั้งหมด</artifactId> <เวอร์ชัน>0.64.8</เวอร์ชัน> </การพึ่งพา>
ที่มา: BasicSample.java
แพ็คเกจ com.vladsch.flexmark.samples; นำเข้า com.vladsch.flexmark.util.ast.Node; นำเข้า com.vladsch.flexmark.html.HtmlRenderer; นำเข้า com.vladsch.flexmark.parser.Parser; นำเข้า com.vladsch.flexmark .util.data.MutableDataSet; BasicSample ระดับสาธารณะ { โมฆะคงที่สาธารณะ main (String [] args) { ตัวเลือก MutableDataSet = MutableDataSet ใหม่ (); // ไม่แสดงข้อคิดเห็นเพื่อตั้งค่าส่วนขยายเพิ่มเติม //options.set(Parser.EXTENSIONS, Arrays.asList(TablesExtension.create(), StrikethroughExtension.create())); // ไม่แสดงข้อคิดเห็นในการแปลงซอฟต์เบรกเป็นการฮาร์ดเบรก //options.set(HtmlRenderer.SOFT_BREAK, "<br />n"); Parser parser = Parser.builder(ตัวเลือก).build(); HtmlRenderer renderer = HtmlRenderer.builder(options).build(); // คุณสามารถใช้ parser และ renderer instance ซ้ำได้ Node document = parser.parse("นี่คือ *Sparta*"); สตริง html = renderer.render (เอกสาร); // "<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 Home รายละเอียดส่วนขยาย การเขียนส่วนขยาย
คลาส PegdownOptionsAdapter
จะแปลงแฟล็ก pegdown Extensions.*
เป็นตัวเลือก flexmark และรายการส่วนขยาย Pegdown Extensions.java
รวมอยู่เพื่อความสะดวกและตัวเลือกใหม่ที่ไม่พบใน pegdown 1.6.0 สิ่งเหล่านี้อยู่ในโมดูล flexmark-profile-pegdown
แต่คุณสามารถคว้าแหล่งที่มาจาก repo นี้: PegdownOptionsAdapter.java, Extensions.java และสร้างเวอร์ชันของคุณเอง ซึ่งแก้ไขตามความต้องการของโปรเจ็กต์ของคุณ
คุณสามารถส่งแฟล็กส่วนขยายของคุณไปที่ PegdownOptionsAdapter.flexmarkOptions(int)
แบบคงที่ หรือคุณสามารถสร้างอินสแตนซ์ PegdownOptionsAdapter
และใช้วิธีการอำนวยความสะดวกในการตั้งค่า เพิ่ม และลบแฟล็กส่วนขยายได้ PegdownOptionsAdapter.getFlexmarkOptions()
จะส่งคืนสำเนาใหม่ของ DataHolder
ทุกครั้งพร้อมตัวเลือกที่สะท้อนถึงแฟล็กส่วนขยาย pegdown
นำเข้า com.vladsch.flexmark.html.HtmlRenderer; นำเข้า com.vladsch.flexmark.parser.Parser; นำเข้า com.vladsch.flexmark.profile.pegdown.Extensions; นำเข้า com.vladsch.flexmark.profile.pegdown.PegdownOptionsAdapter; นำเข้า com .vladsch.flexmark.util.data.DataHolder; PegdownOptions ระดับสาธารณะ { ส่วนตัวสุดท้าย ตัวเลือก DataHolder แบบคงที่ = PegdownOptionsAdapter.flexmarkOptions ( Extensions.ALL - Parser สุดท้ายแบบคงที่ PARSER = Parser.builder(OPTIONS).build(); HtmlRenderer RENDERER สุดท้ายแบบคงที่ = HtmlRenderer.builder(OPTIONS).build(); // ใช้ PARSER เพื่อแยกวิเคราะห์และ RENDERER เพื่อแสดงผลด้วยความเข้ากันได้แบบ pegdown}
การจำลอง pegdown ของ flexmark-java เริ่มต้นใช้การแยกวิเคราะห์บล็อก HTML ที่เข้มงวดน้อยกว่า ซึ่งจะขัดจังหวะบล็อก HTML บนบรรทัดว่าง Pegdown จะขัดจังหวะบล็อก HTML ในบรรทัดว่างเท่านั้นหากแท็กทั้งหมดในบล็อก HTML ถูกปิด
หากต้องการเข้าใกล้พฤติกรรมการแยกวิเคราะห์บล็อก pegdown HTML ดั้งเดิมให้ใช้วิธีการรับอาร์กิวเมนต์ boolean strictHtml
:
นำเข้า com.vladsch.flexmark.html.HtmlRenderer; นำเข้า com.vladsch.flexmark.parser.Parser; นำเข้า com.vladsch.flexmark.profile.pegdown.Extensions; นำเข้า com.vladsch.flexmark.profile.pegdown.PegdownOptionsAdapter; นำเข้า com .vladsch.flexmark.util.data.DataHolder; PegdownOptions ระดับสาธารณะ { ส่วนตัวสุดท้าย ตัวเลือก DataHolder แบบคงที่ = PegdownOptionsAdapter.flexmarkOptions (จริง Extensions.ALL - Parser สุดท้ายแบบคงที่ PARSER = Parser.builder(OPTIONS).build(); HtmlRenderer RENDERER สุดท้ายแบบคงที่ = HtmlRenderer.builder(OPTIONS).build(); // ใช้ PARSER เพื่อแยกวิเคราะห์และ RENDERER เพื่อแสดงผลด้วยความเข้ากันได้แบบ pegdown}
นอกจากนี้ยังมีตัวอย่างที่มีตัวแก้ไขลิงก์แบบกำหนดเอง ซึ่งรวมถึงตัวแก้ไขลิงก์สำหรับการเปลี่ยน URL หรือคุณลักษณะของลิงก์ และตัวเรนเดอร์โหนดแบบกำหนดเอง หากคุณต้องการแทนที่ HTML ของลิงก์ที่สร้างขึ้น
flexmark-java มีส่วนขยายและตัวเลือกการกำหนดค่ามากกว่า pegdown นอกเหนือจากส่วนขยายที่มีอยู่ใน pegdown 1.6.0 ส่วนขยายที่ใช้ได้ผ่าน PegdownOptionsAdapter
การจัดโครงสร้างใหม่ครั้งใหญ่และการล้างโค้ดของการนำไปใช้ในเวอร์ชัน 0.60.0 ดูเวอร์ชัน 0.60.0-การเปลี่ยนแปลงด้วยการทำงานอันยอดเยี่ยมของ Alex Karezin คุณจึงสามารถดูภาพรวมของการขึ้นต่อกันของโมดูลพร้อมความสามารถในการเจาะลึกไปยังแพ็คเกจและคลาสต่างๆ
ผสาน API เพื่อรวมเอกสาร Markdown หลายฉบับให้เป็นเอกสารเดียว
ส่วนขยาย Docx Renderer: การจัดการโหนดแอตทริบิวต์ที่จำกัด
โมดูล HTML ที่ขยายได้เป็น Markdown Converter: flexmark-html2md-converter ตัวอย่าง: HtmlToMarkdownCustomizedSample.java
ความเข้ากันได้ของโมดูล Java9+
การอ้างอิงแบบแจกแจงแบบผสม ส่วนขยายการอ้างอิงแบบแจกแจงสำหรับการสร้างการกำหนดหมายเลขตามกฎหมายสำหรับองค์ประกอบและส่วนหัว
ส่วนขยายมาโครเพื่ออนุญาตให้แทรกเนื้อหามาร์กดาวน์ตามอำเภอใจเป็นองค์ประกอบบล็อกหรืออินไลน์ ช่วยให้สามารถใช้องค์ประกอบบล็อกได้ในกรณีที่อนุญาตให้ใช้องค์ประกอบอินไลน์เท่านั้นโดยใช้ไวยากรณ์
GitLab Flavoured Markdown สำหรับการแยกวิเคราะห์และเรนเดอร์ส่วนขยาย Markdown ของ GitLab
โมดูล OSGi ได้รับความอนุเคราะห์จาก Dan Klco (GitHub @klcodanr)
แท็กสื่อ ส่วนขยายหม้อแปลงลิงก์สื่อได้รับความอนุเคราะห์จาก Cornelia Schultz (GitHub @CorneliaXaos) แปลงลิงก์โดยใช้คำนำหน้าแบบกำหนดเองเป็นแท็กเสียง ฝัง รูปภาพ และวิดีโอ HTML5
Translation Helper API เพื่อให้การแปลเอกสารมาร์กดาวน์ง่ายขึ้น
คำเตือน ในการสร้างเนื้อหาด้านข้างแบบบล็อก สำหรับเอกสารฉบับสมบูรณ์ โปรดดูเอกสารประกอบส่วนขยายการตักเตือน วัสดุสำหรับ MkDocs
การอ้างอิงที่แจกแจง เพื่อสร้างการอ้างอิงที่แจกแจงสำหรับตัวเลข ตาราง และองค์ประกอบมาร์กดาวน์อื่นๆ
แอ็ตทริบิวต์เพื่อแยกวิเคราะห์แอ็ตทริบิวต์ของฟอร์ม {name name=value name='value' name="value" #id .class-name}
แอ็ตทริบิวต์
YouTube Embedded Link Transformer ต้องขอบคุณ Vyacheslav N. Boyko (GitHub @bvn13) แปลงลิงก์ง่ายๆ ไปยังวิดีโอ YouTube ให้เป็นวิดีโอ iframe HTML แบบฝัง
Docx Converter โดยใช้ไลบรารี docx4j วิธีใช้: ตัวอย่าง DocxConverter, วิธีปรับแต่ง: การปรับแต่ง Docx Rendering
การพัฒนาโมดูลนี้ได้รับการสนับสนุนจาก Johner Institut GmbH
อัปเดตไลบรารีให้เป็นไปตามมาตรฐาน CommonMark (spec 0.28) และเพิ่ม ParserEmulationProfile.COMMONMARK_0_27
และ ParserEmulationProfile.COMMONMARK_0_28
เพื่ออนุญาตให้เลือกตัวเลือกเวอร์ชันข้อมูลจำเพาะเฉพาะ
API การเรนเดอร์โหนดแบบกำหนดเองที่มีความสามารถในการเรียกใช้การเรนเดอร์มาตรฐานสำหรับโหนดที่ถูกแทนที่ ช่วยให้สามารถเรนเดอร์โหนดแบบกำหนดเองที่จัดการเฉพาะกรณีพิเศษเท่านั้น และปล่อยให้ส่วนที่เหลือถูกเรนเดอร์ตามปกติ ตัวแก้ไขลิงก์แบบกำหนดเอง
ส่วนขยาย Gfm-Issues และ Gfm-Users สำหรับการแยกวิเคราะห์และการแสดงผล #123
และ @user-name
ตามลำดับ
ตัวเลือกการแยกวิเคราะห์บล็อก HTML แบบลึกเพื่อการจัดการที่ดีขึ้นของแท็กข้อความดิบที่มาหลังแท็กอื่นๆ และสำหรับความเข้ากันได้ของการแยกวิเคราะห์บล็อก HTML แบบ pegdown
โมดูล flexmark-all
ที่ประกอบด้วย: คอร์, ส่วนขยายทั้งหมด, ฟอร์แมตเตอร์, ตัวแปลง JIRA และ YouTrack, โมดูลโปรไฟล์ Pegdown และการแปลง HTML เป็น Markdown
โมดูลเอาต์พุต PDF เอาต์พุต PDF โดยใช้ Open HTML เป็น PDF
มีการใช้ตัวอักษรแล้ว
ส่วนขยายมาโคร XWiki
เจคิลล์ แท็ก
Html ถึงมาร์กดาวน์
ปลั๊กอินตัวสร้างหน้า Maven Markdown
โมดูล Markdown Formatter เพื่อส่งออก AST เป็น markdown พร้อมตัวเลือกการจัดรูปแบบ
ตารางสำหรับ Markdown Formatter ที่มีความกว้างของคอลัมน์และการจัดตำแหน่งของตาราง Markdown:
ป้อนข้อมูล | เอาท์พุต |
---|---|
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 | |
ฉันใช้ flexmark-java เป็นตัวแยกวิเคราะห์สำหรับปลั๊กอิน Markdown Navigator สำหรับ JetBrains IDE ฉันมักจะใช้เวอร์ชันล่าสุดที่ยังไม่ได้เผยแพร่เพื่อแก้ไขจุดบกพร่องหรือรับการปรับปรุง ดังนั้น หากคุณพบจุดบกพร่องที่ขัดขวางการแสดงโครงการของคุณ หรือเห็นจุดบกพร่องในหน้าปัญหา GitHub ที่ทำเครื่องหมายไว้ fixed for next release
ที่ส่งผลกระทบต่อโครงการของคุณ โปรดแจ้งให้เราทราบ และฉันอาจจะสามารถสร้างรุ่นใหม่เพื่อแก้ไขได้ทันที ปัญหาของคุณ มิฉะนั้น ฉันจะปล่อยให้การแก้ไขข้อบกพร่องและการปรับปรุงสะสมโดยคิดว่าไม่มีใครได้รับผลกระทบจากสิ่งที่ได้รับการแก้ไขแล้ว
มีตัวเลือกส่วนขยายมากมายใน API ตามวัตถุประสงค์การใช้งาน การเริ่มต้นแบบนุ่มนวลที่ดีคือโมดูล flexmark-java-samples
ซึ่งมีตัวอย่างง่ายๆ สำหรับการขอส่วนขยาย ตำแหน่งที่ดีที่สุดรองลงมาคือแหล่งที่มาของส่วนขยายที่มีอยู่ซึ่งมีไวยากรณ์คล้ายกับสิ่งที่คุณต้องการเพิ่ม
หากส่วนขยายของคุณสอดคล้องกับ API ที่ถูกต้อง งานมักจะสั้นและไพเราะมาก หากส่วนขยายของคุณใช้ API ในลักษณะที่ไม่ได้ตั้งใจหรือไม่เป็นไปตามโปรโตคอลการดูแลทำความสะอาดที่คาดไว้ คุณอาจพบว่าเป็นการต่อสู้ที่ยากลำบากกับรังหนูในการจัดการเงื่อนไข if/else และแก้ไขข้อบกพร่องหนึ่งเดียวเท่านั้นที่นำไปสู่การสร้างอีกข้อบกพร่องหนึ่ง
โดยทั่วไป หากต้องใช้เวลามากกว่าสองสามบรรทัดในการเพิ่มส่วนขยายแบบง่าย แสดงว่าคุณกำลังดำเนินการผิดหรือ API ขาดจุดส่วนขยาย หากคุณดูส่วนขยายที่นำไปใช้งานทั้งหมด คุณจะเห็นว่าส่วนใหญ่เป็นโค้ดสองสามบรรทัดนอกเหนือจาก Boiler Plate ที่กำหนดโดย API นั่นคือเป้าหมายสำหรับไลบรารีนี้: จัดเตรียมแกนหลักที่ขยายได้ซึ่งทำให้การเขียนส่วนขยายเป็นเรื่องง่าย
ส่วนขยายที่ใหญ่กว่าคือ flexmark-ext-tables
และ flexmark-ext-spec-example
เนื้อของทั้งสองมีโค้ดประมาณ 200 บรรทัด คุณสามารถใช้มันเป็นโพสต์แนะนำในการประมาณขนาดส่วนขยายของคุณได้
ประสบการณ์ของฉันในการเพิ่มส่วนขยายแสดงให้เห็นว่าบางครั้งส่วนขยายประเภทใหม่ได้รับการแก้ไขได้ดีที่สุดด้วยการปรับปรุง API เพื่อให้การใช้งานเป็นไปอย่างราบรื่น หรือโดยการแก้ไขจุดบกพร่องที่ไม่สามารถมองเห็นได้ก่อนที่ส่วนขยายจะเน้นย้ำ API ด้วยวิธีที่ถูกต้อง ส่วนขยายที่คุณตั้งใจอาจเป็นเพียงส่วนขยายที่ต้องการแนวทางดังกล่าว
ประเด็นสำคัญคือ: หากคุณต้องการใช้ส่วนขยายหรือฟีเจอร์ โปรดอย่าลังเลที่จะเปิดปัญหา แล้วฉันจะให้คำแนะนำเกี่ยวกับวิธีที่ดีที่สุดในการแก้ไขปัญหา อาจช่วยคุณประหยัดเวลาได้มากด้วยการให้ฉันปรับปรุง API เพื่อตอบสนองความต้องการของส่วนขยายของคุณ ก่อนที่คุณจะทุ่มเทความพยายามอย่างไร้ผลลงไป
ฉันขอให้คุณตระหนักว่าฉันเป็นหัวหน้าพ่อครัวและคนล้างขวดในโครงการนี้ โดยไม่มีทักษะ Vulcan Mind Melding เลยแม้แต่น้อย ฉันขอให้คุณอธิบายสิ่งที่คุณต้องการนำไปใช้เพราะฉันอ่านใจคุณไม่ออก โปรดทำงานเบื้องหลังการลาดตระเวนเกี่ยวกับซอร์สโค้ดและเอกสารประกอบ เนื่องจากฉันไม่สามารถถ่ายโอนสิ่งที่ฉันรู้ให้กับคุณได้ หากคุณไม่เต็มใจ
หากคุณมีแอปพลิเคชันเชิงพาณิชย์และไม่ต้องการเขียนส่วนขยายด้วยตนเอง หรือต้องการลดเวลาและความพยายามในการใช้ส่วนขยายและบูรณาการ flexmark-java โปรดติดต่อฉันได้ตลอดเวลา ฉันพร้อมให้คำปรึกษา/ทำสัญญา
แม้จะมีชื่อ แต่เครื่องหมายทั่วไปก็ไม่ใช่ทั้งซุปเปอร์เซ็ตหรือเซตย่อยของรสชาติที่ลดราคาอื่นๆ แต่เสนอข้อกำหนดทางไวยากรณ์ที่เป็นมาตรฐานและไม่คลุมเครือสำหรับ Markdown ที่เป็น "คอร์" ดั้งเดิม ดังนั้นจึงแนะนำรสชาติอื่นได้อย่างมีประสิทธิภาพ แม้ว่า Flexmark จะเป็นไปตามมาตรฐาน Commonmark ตามค่าเริ่มต้น แต่ Parser ก็สามารถปรับแต่งได้หลายวิธี ชุดของการปรับแต่งที่จำเป็นในการจำลองตัวแยกวิเคราะห์มาร์กดาวน์ที่ใช้บ่อยที่สุดนั้นมีอยู่ใน flexmark ในชื่อ ParserEmulationProfiles
ตามที่ชื่อ ParserEmulationProfile
บอกเป็นนัย มีเพียง parser เท่านั้นที่ถูกปรับให้เข้ากับรสชาติของมาร์กดาวน์เฉพาะ การใช้โปรไฟล์ไม่ได้เพิ่มคุณสมบัติที่นอกเหนือไปจากคุณสมบัติทั่วไป หากคุณต้องการใช้ flexmark เพื่อจำลองการทำงานของตัวประมวลผล markdown อื่นอย่างสมบูรณ์ คุณต้องปรับ parser และกำหนดค่าส่วนขยาย flexmark ที่ให้คุณลักษณะเพิ่มเติมที่มีอยู่ใน parser ที่คุณต้องการจำลอง
การเขียนตัวแยกวิเคราะห์รายการใหม่เพื่อควบคุมการจำลองตัวประมวลผลมาร์กดาวน์อื่นๆ ได้ดีขึ้นตามการจำลองตัวประมวลผลมาร์กดาวน์เสร็จสมบูรณ์ การเพิ่มค่าที่ตั้งไว้ล่วงหน้าของโปรเซสเซอร์เพื่อจำลองลักษณะการประมวลผลมาร์กดาวน์เฉพาะของตัวแยกวิเคราะห์เหล่านี้อยู่ในรายการสิ่งที่ต้องทำสั้นๆ
ตระกูลการจำลองบางตระกูลสามารถเลียนแบบเป้าหมายได้ดีกว่าตระกูลอื่น ๆ ความพยายามส่วนใหญ่มุ่งเน้นไปที่การจำลองวิธีที่โปรเซสเซอร์เหล่านี้แยกวิเคราะห์ Markdown มาตรฐานและแสดงรายการการแยกวิเคราะห์ที่เกี่ยวข้องโดยเฉพาะ สำหรับโปรเซสเซอร์ที่ขยาย Markdown ดั้งเดิม คุณจะต้องเพิ่มส่วนขยายเหล่านั้นที่ใช้งานแล้วใน flexmark-java ไปยังตัวเลือกตัวสร้าง Parser/Renderer
ส่วนขยายจะได้รับการแก้ไขเพื่อรวมค่าที่ตั้งไว้ล่วงหน้าของตัวเองสำหรับการจำลองโปรเซสเซอร์เฉพาะ หากโปรเซสเซอร์นั้นมีการใช้ส่วนขยายที่เทียบเท่ากัน
หากคุณพบความคลาดเคลื่อน โปรดเปิดปัญหาเพื่อให้สามารถแก้ไขได้
ตระกูลโปรเซสเซอร์หลักๆ ได้รับการนำไปใช้และสมาชิกครอบครัวบางคนยัง:
เจคิลล์
CommonMark สำหรับข้อมูลจำเพาะที่ใช้งานล่าสุด ปัจจุบัน CommonMark (spec 0.28)
ลีก/คอมมอนมาร์ค
CommonMark (spec 0.27) สำหรับความเข้ากันได้ของเวอร์ชันเฉพาะ
CommonMark (spec 0.28) สำหรับความเข้ากันได้ของเวอร์ชันเฉพาะ
ความคิดเห็น GitHub
Markdown.pl
Php Markdown พิเศษ
GitHub Docs (ตัวแยกวิเคราะห์ GitHub markdown เก่า)
ครามดาวน์
แก้ไขเยื้อง
มัลติมาร์กดาวน์
เพกดาวน์
โปรไฟล์เพื่อสรุปรายละเอียดการกำหนดค่าสำหรับตัวแปรภายในตระกูลถูกเพิ่มใน 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
MultiMarkdown: ParserEmulationProfile.MULTI_MARKDOWN
Pegdown ซึ่งมีส่วนขยาย pegdown ใช้ PegdownOptionsAdapter
ใน flexmark-profile-pegdown
Pegdown โดยไม่มีส่วนขยาย Pegdown ParserEmulationProfile.PEGDOWN
กฎการแยกวิเคราะห์บล็อก Pegdown HTML โดยไม่มีส่วนขยาย pegdown ParserEmulationProfile.PEGDOWN_STRICT
flexmark-java เป็นทางแยกของโปรเจ็กต์ commonmark-java ซึ่งได้รับการดัดแปลงเพื่อสร้าง AST ซึ่งสะท้อนถึงองค์ประกอบทั้งหมดในแหล่งที่มาดั้งเดิม การติดตามตำแหน่งแหล่งที่มาแบบเต็มสำหรับองค์ประกอบทั้งหมดใน AST และการสร้าง JetBrains Open API PsiTree ที่ง่ายขึ้น
API ได้รับการเปลี่ยนแปลงเพื่อให้สามารถควบคุมกระบวนการแยกวิเคราะห์ได้ละเอียดยิ่งขึ้น และปรับให้เหมาะสมสำหรับการแยกวิเคราะห์ด้วยส่วนขยายที่ติดตั้งจำนวนมาก ตัวแยกวิเคราะห์และส่วนขยายมาพร้อมกับตัวเลือกการปรับแต่งมากมายสำหรับพฤติกรรมของตัวแยกวิเคราะห์และรูปแบบการแสดงผล HTML เป้าหมายสุดท้ายคือการให้ parser และ renderer สามารถเลียนแบบ parsers อื่นๆ ได้อย่างแม่นยำในระดับสูงสุด
แรงจูงใจสำหรับสิ่งนี้คือความจำเป็นในการแทนที่ตัวแยกวิเคราะห์ pegdown ในปลั๊กอิน Markdown Navigator pegdown มีชุดคุณลักษณะที่ยอดเยี่ยม แต่ความเร็วโดยทั่วไปนั้นน้อยกว่าอุดมคติ และสำหรับการป้อนข้อมูลทางพยาธิวิทยาอาจค้างหรือหยุดทำงานจริงในระหว่างการแยกวิเคราะห์
commonmark-java มีสถาปัตยกรรมการแยกวิเคราะห์ที่ยอดเยี่ยม ซึ่งง่ายต่อการเข้าใจและขยาย เป้าหมายคือเพื่อให้แน่ใจว่าการเพิ่มการติดตามตำแหน่งแหล่งที่มาใน AST จะไม่เปลี่ยนความง่ายในการแยกวิเคราะห์และสร้าง AST มากเกินความจำเป็นจริงๆ
เหตุผลในการเลือก commonmark-java เป็น parser คือ: ความเร็ว ความง่ายในการทำความเข้าใจ ความง่ายในการขยาย และความเร็ว ตอนนี้ฉันได้ปรับปรุงแกนหลักและเพิ่มส่วนขยายบางส่วนแล้ว ฉันพอใจมากกับตัวเลือกของฉัน
เป้าหมายอีกประการหนึ่งคือการปรับปรุงความสามารถของส่วนขยายในการปรับเปลี่ยนพฤติกรรมของพาร์เซอร์เพื่อให้สามารถใช้งานภาษาถิ่นของมาร์กดาวน์ผ่านกลไกส่วนขยาย เพิ่ม API ตัวเลือกที่ขยายได้เพื่อให้สามารถตั้งค่าตัวเลือกทั้งหมดได้ในที่เดียว Parser, Renderer และ Extension ใช้ตัวเลือกเหล่านี้ในการกำหนดค่า รวมถึงการปิดใช้งาน Parser บล็อกหลักบางตัว
นี่เป็นงานที่กำลังดำเนินการโดยมีการเปลี่ยนแปลง API มากมาย ไม่มีการพยายามรักษาความเข้ากันได้ของ API แบบย้อนหลังกับโปรเจ็กต์ดั้งเดิม และจนกว่าชุดฟีเจอร์จะเสร็จสมบูรณ์เป็นส่วนใหญ่ แม้แต่เวอร์ชันก่อนหน้าของโปรเจ็กต์นี้ก็ตาม
คุณสมบัติ | เฟล็กมาร์ก-java | Commonmark-java | เพกดาวน์ |
---|---|---|---|
เวลาแยกวิเคราะห์สัมพัทธ์ (น้อยกว่าดีกว่า) | 1x (1) | 0.6x ถึง 0.7x (2) | เฉลี่ย 25x, 20,000x ถึง ∞ สำหรับการป้อนข้อมูลทางพยาธิวิทยา (3) |
องค์ประกอบต้นทางทั้งหมดใน AST | |||
องค์ประกอบ AST พร้อมตำแหน่งแหล่งที่มา | มีข้อผิดพลาดและลักษณะเฉพาะบางประการ | ||
AST สามารถจัดการได้อย่างง่ายดาย | การประมวลผลภายหลัง AST เป็นกลไกการขยาย | การประมวลผลภายหลัง AST เป็นกลไกการขยาย | ไม่ใช่ตัวเลือก ไม่มีข้อมูลพาเรนต์ของโหนด ลูกเป็น List<> |
องค์ประกอบ AST มีตำแหน่งแหล่งที่มาโดยละเอียดสำหรับทุกส่วน | โหนดเริ่มต้น/สิ้นสุดเท่านั้น | ||
สามารถปิดใช้งานคุณลักษณะการแยกวิเคราะห์หลักได้ | |||
ตัวแยกวิเคราะห์หลักใช้งานผ่านส่วนขยาย API | การทดสอบ instanceOf สำหรับตัวแยกวิเคราะห์บล็อกและคลาสโหนดเฉพาะ | แกนเปิดเผยจุดขยายไม่กี่จุด | |
ง่ายต่อการเข้าใจและแก้ไขการใช้งาน parser | ตัวแยกวิเคราะห์ PEG หนึ่งตัวที่มีการโต้ตอบที่ซับซ้อน (3) | ||
การแยกวิเคราะห์องค์ประกอบบล็อกเป็นอิสระจากกัน | ทุกอย่างในไวยากรณ์ PEG เดียว | ||
การกำหนดค่าที่เหมือนกันทั้ง: parser, renderer และส่วนขยายทั้งหมด | ไม่มีรายการใดนอกเหนือจากรายการส่วนขยาย | int bit flags สำหรับ core และไม่มีสำหรับส่วนขยาย | |
ประสิทธิภาพการแยกวิเคราะห์ที่ปรับให้เหมาะสมเพื่อใช้กับส่วนขยาย | แยกวิเคราะห์ประสิทธิภาพสำหรับคอร์ ส่วนขยายทำในสิ่งที่พวกเขาทำได้ | ประสิทธิภาพไม่ใช่คุณสมบัติ | |
ฟีเจอร์มากมายพร้อมตัวเลือกการกำหนดค่าและส่วนขยายมากมายนอกกรอบ | ส่วนขยายมีจำกัด ไม่มีตัวเลือก | ||
คำจำกัดความการพึ่งพาสำหรับโปรเซสเซอร์เพื่อรับประกันลำดับการประมวลผลที่ถูกต้อง | ลำดับที่ระบุโดยการเรียงลำดับรายการส่วนขยาย มีแนวโน้มที่จะเกิดข้อผิดพลาด | ไม่สามารถใช้งานได้ คอร์จะกำหนดว่าจะเพิ่มการประมวลผลส่วนขยายไปที่ใด |
อินพุตทางพยาธิวิทยาของ flexmark-java 100,000 [
แยกวิเคราะห์ใน 68ms, 100,000 ]
ใน 57ms, 100,000 ซ้อน [
]
แยกวิเคราะห์ใน 55ms
อินพุตทางพยาธิวิทยา commonmark-java 100,000 [
แยกวิเคราะห์ใน 30ms, 100,000 ]
ใน 30ms, 100,000 ซ้อน [
]
แยกวิเคราะห์ใน 43ms
อินพุตทางพยาธิวิทยา pegdown ของ 17 [
แยกวิเคราะห์ใน 650ms, 18 [
ใน 1300ms
ตัวเลือกตัวแยกวิเคราะห์ รายการที่ทำเครื่องหมายว่าเป็นรายการงานจะต้องนำไปใช้ ส่วนที่เหลือจะเสร็จสมบูรณ์:
รายการหลวมด้วยตนเอง
รายการที่เรียงลำดับเลขจะเริ่มต้นด้วย 1 เสมอ
แก้ไขการเยื้องรายการ รายการจะต้องเยื้องอย่างน้อย 4 ช่องว่าง
ตัวเลือกการเริ่มต้นรายการแบบผ่อนคลาย อนุญาตให้รายการเริ่มต้นเมื่อไม่มีบรรทัดว่างนำหน้า
เรื่องด้านหน้าของเจคิลล์
องค์ประกอบแท็ก Jekyll พร้อมการสนับสนุน {% include file %}
รวมเนื้อหาไฟล์ Markdown และ HTML
การเข้ารหัส URL ลิงก์ GitBook ไม่สามารถใช้ได้
โหนดความคิดเห็น HTML: บล็อกและอินไลน์
URL รูปภาพหลายบรรทัด
องค์ประกอบตัวอย่างข้อมูลจำเพาะ
HTML แบบอินไลน์: ทั้งหมด ไม่ใช่ความคิดเห็น ความคิดเห็น
บล็อก HTML: ทั้งหมด ไม่ใช่ความคิดเห็น ความคิดเห็น
คำย่อ
เชิงอรรถ
คำจำกัดความ
สารบัญ
ขีดทับ
รายการงาน
ไม่มีพื้นที่ส่วนหัว Atx
ไม่มีการเยื้องส่วนหัว
Hard Wraps (ทำได้ด้วยตัวเลือก SOFT_BREAK เปลี่ยนเป็น "<br />"
)
ตัวเลือกกฎ HR ที่ผ่อนคลาย
ลิงก์วิกิ
บล็อกรหัสรั้ว
ลิงก์จุดยึดสำหรับส่วนหัวพร้อมการสร้างรหัสอัตโนมัติ
ตัวเลือกช่วงตารางที่จะนำมาใช้สำหรับการขยายตาราง
ลิงก์ Wiki พร้อมไวยากรณ์ GitHub และ Creole
ทางลัด Emoji พร้อมตัวเลือก GitHub emoji URL
คำคม
กึ๋น
วิชาการพิมพ์
ส่วนขยาย GitHub
ไวยากรณ์ GitHub
การเผยแพร่
ปราบปราม
ส่วนขยายโปรเซสเซอร์
การปราบปรามไวยากรณ์ Commonmark
ฉันพอใจมากกับการตัดสินใจเปลี่ยนไปใช้ parser ที่ใช้ commonmark-java สำหรับโครงการของฉันเอง แม้ว่าฉันต้องทำการผ่าตัดใหญ่อวัยวะภายในเพื่อให้ได้การติดตามตำแหน่งของแหล่งที่มาอย่างเต็มรูปแบบและ AST ที่ตรงกับองค์ประกอบของแหล่งที่มา แต่ก็ยินดีที่ได้ร่วมงานด้วย และตอนนี้ก็ยินดีที่จะขยายออกไป หากคุณไม่ต้องการองค์ประกอบระดับแหล่งที่มา AST หรือส่วนที่เหลือของสิ่งที่เพิ่ม flexmark-java และ CommonMark เป็นตัวแยกวิเคราะห์มาร์กดาวน์เป้าหมายของคุณ ฉันขอแนะนำให้คุณใช้ commonmark-java เนื่องจากเป็นตัวเลือกที่ยอดเยี่ยมสำหรับความต้องการของคุณและประสิทธิภาพการทำงานก็ไม่ลดลง สำหรับคุณสมบัติโอเวอร์เฮดที่คุณจะไม่ใช้
ล่าสุด, 28 มกราคม 2017 flexmark-java 0.13.1, Intellij-markdown จาก CE EAP 2017, commonmark-java 0.8.0:
ไฟล์ | Commonmark-java | เฟล็กมาร์ก-java | Intellij-มาร์กดาวน์ | เพกดาวน์ |
---|---|---|---|---|
README-ช้า | 0.420ms | 0.812ms | 2.027ms | 15.483ms |
รุ่น | 0.743ms | 1.425ms | 4.057ms | 42.936ms |
ทั่วไปMarkSpec | 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 | เฟล็กมาร์ก-java | Intellij-มาร์กดาวน์ | เพกดาวน์ |
---|---|---|---|---|
README-ช้า | 1.00 น | 1.93 | 4.83 | 36.88 |
รุ่น | 1.00 น | 1.92 | 5.46 | 57.78 |
ทั่วไปMarkSpec | 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 | 03.00 น | 17.03 |
ห่อ | 1.00 น | 1.21 | 4.37 | 22.71 |
โดยรวม | 1.00 น | 1.41 | 17.47 | 40.11 |
ไฟล์ | Commonmark-java | เฟล็กมาร์ก-java | Intellij-มาร์กดาวน์ | เพกดาวน์ |
---|---|---|---|---|
README-ช้า | 0.52 | 1.00 น | 2.50 | 19.07 |
รุ่น | 0.52 | 1.00 น | 2.85 | 30.12 |
ทั่วไปMarkSpec | 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 |
เนื่องจากไฟล์ทั้งสองนี้แสดงถึงอินพุตทางพยาธิวิทยาของ pegdown ฉันจึงไม่เรียกใช้ไฟล์เหล่านี้โดยเป็นส่วนหนึ่งของการวัดประสิทธิภาพอีกต่อไปเพื่อป้องกันการบิดเบือนผลลัพธ์ ผลลัพธ์อยู่ที่นี่เพื่อลูกหลาน
ไฟล์ | Commonmark-java | เฟล็กซ์มาร์ก-java | Intellij-มาร์กดาวน์ | เพกดาวน์ |
---|---|---|---|---|
แขวน Pegdown | 0.082ms | 0.326ms | 0.342ms | 659.138ms |
แขวน Pegdown2 | 0.048ms | 0.235ms | 0.198ms | 1312.944ms |
อัตราส่วนข้างต้น:
ไฟล์ | Commonmark-java | เฟล็กซ์มาร์ก-java | Intellij-มาร์กดาวน์ | เพกดาวน์ |
---|---|---|---|---|
แขวน Pegdown | 1.00 น | 3.98 | 4.17 | 8048.38 |
แขวน Pegdown2 | 1.00 น | 4.86 | 4.10 | 27207.32 |
โดยรวม | 1.00 น | 4.30 | 4.15 | 15151.91 |
ไฟล์ | Commonmark-java | เฟล็กซ์มาร์ก-java | Intellij-มาร์กดาวน์ | เพกดาวน์ |
---|---|---|---|---|
แขวน Pegdown | 0.25 | 1.00 น | 1.05 | 2024.27 |
แขวน Pegdown2 | 0.21 | 1.00 น | 0.84 | 5594.73 |
โดยรวม | 0.23 | 1.00 น | 0.96 | 3519.73 |
VERSION.md คือไฟล์บันทึกเวอร์ชันที่ฉันใช้สำหรับ Markdown Navigator
commonMarkSpec.md เป็นไฟล์บรรทัดขนาด 33,000 รายการที่ใช้ในชุดทดสอบ Intellij-markdown สำหรับการประเมินประสิทธิภาพ
ไฟล์ markdown spec.txt commonmark ในโครงการ commonmark-java
hang-pegdown.md เป็นไฟล์ที่ประกอบด้วยบรรทัดเดียวจำนวน 17 ตัวอักษร [[[[[[[[[[[[[[[[[
ซึ่งทำให้ pegdown เข้าสู่เวลาแยกวิเคราะห์แบบเอ็กซ์โพเนนเชียลแบบไฮเปอร์เอ็กซ์โปเนนเชียล
hang-pegdown2.md ไฟล์ที่มีบรรทัดเดียวจำนวน 18 ตัวอักษร [[[[[[[[[[[[[[[[[[
ซึ่งทำให้ pegdown เข้าสู่เวลาแยกวิเคราะห์แบบเอ็กซ์โพเนนเชียลแบบไฮเปอร์เอ็กซ์โปเนนเชียล
wrap.md เป็นไฟล์ที่ฉันใช้เพื่อทดสอบประสิทธิภาพการพิมพ์เพียงเพื่อจะพบว่ามันไม่เกี่ยวอะไรกับโค้ดการพิมพ์แบบ wrap เมื่อ pegdown ใช้เวลา 0.1 วินาทีในการแยกวิเคราะห์ไฟล์ ในปลั๊กอิน การแยกวิเคราะห์อาจเกิดขึ้นมากกว่าหนึ่งครั้ง: การผ่านตัวเน้นไวยากรณ์, การผ่านการสร้างแผนผัง psi, ตัวอธิบายภายนอก
markdown_example.md ไฟล์ที่มีมากกว่า 10,000 บรรทัดและมีข้อความขนาด 500kB+
ยินดีต้อนรับคำขอดึงประเด็นและความคิดเห็น สำหรับคำขอดึง:
เพิ่มการทดสอบคุณสมบัติใหม่และการแก้ไขข้อบกพร่อง โดยควรอยู่ในรูปแบบ ast_spec.md
ปฏิบัติตามสไตล์ที่มีอยู่เพื่อทำให้การรวมง่ายขึ้นมากที่สุด: เยื้องช่องว่าง 4 ช่อง ตัดช่องว่างต่อท้ายออก
ลิขสิทธิ์ (c) 2015-2016 Atlassian และอื่นๆ
ลิขสิทธิ์ (c) 2016-2023, Vladimir Schneider,
ได้รับอนุญาต BSD (2 ข้อ) ดูไฟล์ LICENSE.txt