From df07e9a2bd938e18295e5a9f5afcbe6a77dbd708 Mon Sep 17 00:00:00 2001
From: "Fletcher T. Penney"
Date: Fri, 10 Mar 2017 19:40:43 -0500
Subject: [PATCH] CHANGED: Update QuickStart
---
QuickStart.fodt | 1200 +++++++++++++++++++++--------------------------
QuickStart.html | 5 -
QuickStart.pdf | Bin 85151 -> 84936 bytes
QuickStart.txt | 11 +-
4 files changed, 548 insertions(+), 668 deletions(-)
diff --git a/QuickStart.fodt b/QuickStart.fodt
index 37ec55a..06f4376 100644
--- a/QuickStart.fodt
+++ b/QuickStart.fodt
@@ -1,662 +1,554 @@
-
-
-
- MultiMarkdown v6 Quick Start Guide
-
-
-2017-03-10T14:48:35.565769000Fletcher PenneyPT4S1LibreOffice/5.0.3.2$MacOSX_X86_64 LibreOffice_project/e5f16313668ac592c1bfb310f4390624e3dbfb75Fletcher T. Penney6.0-b
-
-
- 0
- 0
- 16298
- 17762
- true
- false
-
-
- view2
- 2501
- 2925
- 0
- 0
- 16297
- 17761
- 0
- 0
- false
- 80
- false
-
-
-
-
- true
- true
- 0
- true
- true
- false
- true
-
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- false
- true
- true
- false
- false
- true
-
- false
- false
- false
-
-
- false
- false
- 0
- false
- false
- false
- true
- 1
- false
- 2066055
- true
- false
- false
- true
- false
-
- true
- true
- false
- false
- false
- false
-
- false
- high-resolution
- false
- false
- true
- false
- true
- true
-
- 2066055
- true
- false
- false
- false
- false
- false
- false
- true
- false
- true
- false
- false
- true
- 0
- false
- true
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- Bibliography
-
-
-
+
+ Bibliography
+
-
-
-
-
-
-
-
-
-
-
- Table of Contents
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Table of Contents
-
- Introduction1
- Performance1
- Parse Tree3
- Features3
- Abbreviations (Or Acronyms)3
- Citations4
- CriticMarkup4
- Emph and Strong4
- Fenced Code Blocks4
- Glossary Terms4
- Internationalization4
- Metadata5
- Table of Contents5
- Future Steps5
-
-
- Introduction
- Version: 6.0-b
- This document serves as a description of MultiMarkdown (MMD) v6, as well as a sample document to demonstrate the various features. Specifically, differences from MMD v5 will be pointed out.
- Performance
- A big motivating factor leading to the development of MMD v6 was performance. When MMD first migrated from Perl to C (based on peg- markdown), it was among the fastest Markdown parsers available. That was many years ago, and the âcompetitionâ has made a great deal of progress since that time.
- When developing MMD v6, one of my goals was to keep MMD at least in the ballpark of the fastest processors. Of course, being the fastest would be fantastic, but I was more concerned with ensuring that the code was easily understood, and easily updated with new features in the future.
- MMD v3 â v5 used a PEGa
- Parsing Expression Grammar https://en.wikipedia.org/wiki/Parsing_expression_grammar to handle the parsing. This made it easy to understand the relationship between the MMD grammar and the parsing code, since they were one and the same. However, the parsing code generated by the parsers was not particularly fast, and was prone to troublesome edge cases with terrible performance characteristics.
- The first step in MMD v6 parsing is to break the source text into a series of tokens, which may consist of plain text, whitespace, or special characters such as â*â, â[â, etc. This chain of tokens is then used to perform the actual parsing.
- MMD v6 divides the parsing into two separate phases, which actually fits more with Markdownâs design philosophically.
-
-
- Block parsing consists of identifying the âtypeâ of each line of the source text, and grouping the lines into blocks (e.g. paragraphs, lists, blockquotes, etc.) Some blocks are a single line (e.g. ATX headers), and others can be many lines long. The block parsing in MMD v6 is handled by a parser generated by lemon. This parser allows the block structure to be more readily understood by non-programmers, but the generated parser is still fast.
-
-
- Span parsing consists of identifying Markdown/MMD structures that occur inside of blocks, such as links, images, strong, emph, etc. Most of these structures require matching pairs of tokens to specify where the span starts and where it ends. Most of these spans allow arbitrary levels of nesting as well. This made parsing them correctly in the PEG-based code difficult and slow. MMD v6 uses a different approach that is accurate and has good performance characteristics even with edge cases. Basically, it keeps a stack of each âopeningâ token as it steps through the token chain. When a âclosingâ token is found, it is paired with the most recent appropriate opener on the stack. Any tokens in between the opener and closer are removed, as they are not able to be matched any more. To avoid unnecessary searches for non- existent openers, the parser keeps track of which opening tokens have been discovered. This allows the parser to continue moving forwards without having to go backwards and re-parse any previously visited tokens.
-
-
- The result of this redesigned MMD parser is that it can parse short documents more quickly than CommonMark, and takes only 15% â 20% longer to parse long documents. I have not delved too deeply into this, but I presume that CommonMark has a bit more âset-upâ time that becomes expensive when parsing a short document (e.g. a paragraph or two). But this cost becomes negligible when parsing longer documents (e.g. file sizes of 1 MB). So depending on your use case, CommonMark may well be faster than MMD, but weâre talking about splitting hairs hereâ¦. Recent comparisons show MMD v6 taking approximately 4.37 seconds to parse a 108 MB file (approximately 24.8 MB/second), and CommonMark took 3.72 seconds for the same file (29.2 MB/second). For comparison, MMD v5.4 took approximately 94 second for the same file (1.15 MB/second).
- For a more realistic file of approx 28 kb (the source of the Markdown Syntax web page), both MMD and CommonMark parse it too quickly to accurately measure. In fact, it requires a file consisting of the original file copied 32 times over (0.85 MB) before /usr/bin/env time reports a time over the minimum threshold of 0.01 seconds for either program.
- There is still potentially room for additional optimization in MMD. However, even if I canât close the performance gap with CommonMark on longer files, the additional features of MMD compared with Markdown in addition to the increased legibility of the source code of MMD (in my biased opinion anyway) make this project worthwhile.
- Parse Tree
- MMD v6 performs its parsing in the following steps:
-
-
- Start with a null-terminated string of source text (C style string)
-
-
- Lex string into token chain
-
-
- Parse token chain into blocks
-
-
- Parse tokens within each block into span level structures (e.g. strong, emph, etc.)
-
-
- Export the token tree into the desired output format (e.g. HTML, LaTeX, etc.) and return the resulting C style string
- OR
-
-
- Use the resulting token tree for your own purposes.
-
-
- The token tree (ASTa
- Abstract Syntax Tree https://en.wikipedia.org/wiki/Abstract_syntax_tree) includes starting offsets and length of each token, allowing you to use MMD as part of a syntax highlighter. MMD v5 did not have this functionality in the public version, in part because the PEG parsers used did not provide reliable offset positions, requiring a great deal of effort when I adapted MMD for use in MultiMarkdown Composer.
- These steps are managed using the mmd_engine âobjectâ. An individual mmd_engine cannot be used by multiple threads simultaneously, so if libMultiMarkdown is to be used in a multithreaded program, a separate mmd_engine should be created for each thread. Alternatively, just use the slightly more abstracted mmd_convert_string() function that handles creating and destroying the mmd_engine automatically.
- Features
- Abbreviations (Or Acronyms)
- This file includes the use of MMD as an abbreviation for MultiMarkdown. The abbreviation will be expanded on the first use, and the shortened form will be used on subsequent occurrences.
- Abbreviations can be specified using inline or reference syntax. The inline variant requires that the abbreviation be wrapped in parentheses and immediately follows the >.
- [>MMD] is an abbreviation. So is [>(MD) Markdown].[>MMD]: MultiMarkdown
- There is also a âshortcutâ method for abbreviations that is similar to the approach used in prior versions of MMD. You specify the definition for the abbreviation in the usual manner, but MMD will automatically identify each instance where the abbreviation is used and substitute it automatically. In this case, the abbreviation is limited to a more basic character set which includes letters, numbers, periods, and hyphens, but not much else. For more complex abbreviations, you must explicitly mark uses of the abbreviation.
- Citations
- Citations can be specified using an inline syntax, just like inline footnotes.
- CriticMarkup
- MMD v6 has improved support for CriticMarkup, both in terms of parsing, and in terms of support for each output format. You can insert text, delete text, substitute one thingfor another, highlight text, and leave comments in the text.
- Emph and Strong
- The basics of emphasis and strong emphasis are unchanged, but the parsing engine has been improved to be more accurate, particularly in various edge cases where proper parsing can be difficult.
- Fenced Code Blocks
- Fenced code blocks are fundamentally the same as MMD v5, except:
-
-
- The leading and trailing fences can be 3, 4, or 5 backticks in length. That should be sufficient to account for complex documents without requiring a more complex parser.
-
-
- If there is no trailing fence, then everything after the leading fence is considered to be part of the code block.
-
-
- Glossary Terms
- If there are terms in your document you wish to define in a glossarya
- The glossary collects information about important terms used in your document at the end of your document, you can define them using the glossary syntax.
- Glossary terms can be specified using inline or reference syntax. The inline variant requires that the abbreviation be wrapped in parentheses and immediately follows the ?.
- [?(glossary) The glossary collects information about importantterms used in your document] is a glossary term.[?glossary] is also a glossary term.[?glossary]: The glossary collects information about importantterms used in your document
- Much like abbreviations, there is also a âshortcutâ method that is similar to the approach used in prior versions of MMD. You specify the definition for the glossary term in the usual manner, but MMD will automatically identify each instance where the term is used and substitute it automatically. In this case, the term is limited to a more basic character set which includes letters, numbers, periods, and hyphens, but not much else. For more complex glossary terms, you must explicitly mark uses of the term.
- Internationalization
- MMD v6 includes support for substituting certain text phrases in other languages. This only affects the HTML format.
- Metadata
- Metadata in MMD v6 includes new support for LaTeX â the latex config key allows you to automatically setup of multiple latex include files at once. The default setups that I use would typically consist of one LaTeX file to be included at the top of the file, one to be included right at the beginning of the document, and one to be included at the end of the document. If you want to specify the latex files separately, you can use latex leader, latexbegin, and latex footer.
- Table of Contents
- By placing {{TOC}} in your document, you can insert an automatically generated Table of Contents in your document. As of MMD v6, the native Table of Contents functionality is used when exporting to LaTeX or OpenDocument formats.
- Future Steps
- Some features I plan to implement at some point:
-
-
- MMD v5 used to automatically identify abbreviated terms throughout the document and substitute them automatically. I plan to reimplement this functionality, but will probably improve upon it to include glossary terms, and possibly even support for indexing documents in LaTeX (and possibly OpenOffice).
-
-
- OPML export support is not available in v6. I plan on adding improved support for this at some point. I was hoping to be able to re-use the existing v6 parser but it might be simpler to use the approach from v5 and earlier, which was to have a separate parser tuned to only identify headers and âstuff between headersâ.
-
-
- Improved EPUB support. Currently, EPUB support is provided by a separate tool. At some point, I would like to better integrate this into MMD itself.
-
-
-
-
-
\ No newline at end of file
+
+ MultiMarkdown v6 Quick Start Guide
+ Fletcher T. Penney
+ 6.0-b
+
+
+
+
+
+Table of Contents
+
+
+
+Table of Contents
+
+Introduction 1
+Performance 1
+Parse Tree 1
+Features 1
+Abbreviations (Or Acronyms) 1
+Citations 1
+CriticMarkup 1
+Emph and Strong 1
+Fenced Code Blocks 1
+Glossary Terms 1
+Internationalization 1
+Metadata 1
+Table of Contents 1
+Future Steps 1
+
+
+
+
+Introduction
+
+Version: 6.0-b
+
+This document serves as a description of MultiMarkdown (MMD) v6, as well as a sample
+document to demonstrate the various features. Specifically, differences from
+MMD v5 will be pointed out.
+
+Performance
+
+A big motivating factor leading to the development of MMD v6 was
+performance. When MMD first migrated from Perl to C (based on peg-
+markdown), it was among the fastest
+Markdown parsers available. That was many years ago, and the “competition”
+has made a great deal of progress since that time.
+
+When developing MMD v6, one of my goals was to keep MMD at least in the
+ballpark of the fastest processors. Of course, being the fastest would be
+fantastic, but I was more concerned with ensuring that the code was easily
+understood, and easily updated with new features in the future.
+
+MMD v3 – v5 used a PEGParsing Expression Grammar https://en.wikipedia.org/wiki/Parsing_expression_grammar to handle the parsing. This made it easy to
+understand the relationship between the MMD grammar and the parsing code,
+since they were one and the same. However, the parsing code generated by
+the parsers was not particularly fast, and was prone to troublesome edge
+cases with terrible performance characteristics.
+
+The first step in MMD v6 parsing is to break the source text into a series
+of tokens, which may consist of plain text, whitespace, or special characters
+such as ‘*’, ‘[’, etc. This chain of tokens is then used to perform the
+actual parsing.
+
+MMD v6 divides the parsing into two separate phases, which actually fits
+more with Markdown’s design philosophically.
+
+
+
+Block parsing consists of identifying the “type” of each line of the
+source text, and grouping the lines into blocks (e.g. paragraphs, lists,
+blockquotes, etc.) Some blocks are a single line (e.g. ATX headers), and
+others can be many lines long. The block parsing in MMD v6 is handled
+by a parser generated by lemon. This
+parser allows the block structure to be more readily understood by
+non-programmers, but the generated parser is still fast.
+
+
+Span parsing consists of identifying Markdown/MMD structures that occur
+inside of blocks, such as links, images, strong, emph, etc. Most of these
+structures require matching pairs of tokens to specify where the span starts
+and where it ends. Most of these spans allow arbitrary levels of nesting as
+well. This made parsing them correctly in the PEG-based code difficult and
+slow. MMD v6 uses a different approach that is accurate and has good
+performance characteristics even with edge cases. Basically, it keeps a stack
+of each “opening” token as it steps through the token chain. When a “closing”
+token is found, it is paired with the most recent appropriate opener on the
+stack. Any tokens in between the opener and closer are removed, as they are
+not able to be matched any more. To avoid unnecessary searches for non-
+existent openers, the parser keeps track of which opening tokens have been
+discovered. This allows the parser to continue moving forwards without having
+to go backwards and re-parse any previously visited tokens.
+
+
+
+The result of this redesigned MMD parser is that it can parse short
+documents more quickly than CommonMark, and takes
+only 15% – 20% longer to parse long documents. I have not delved too deeply
+into this, but I presume that CommonMark has a bit more “set-up” time that
+becomes expensive when parsing a short document (e.g. a paragraph or two). But
+this cost becomes negligible when parsing longer documents (e.g. file sizes of
+1 MB). So depending on your use case, CommonMark may well be faster than
+MMD, but we’re talking about splitting hairs here…. Recent comparisons
+show MMD v6 taking approximately 4.37 seconds to parse a 108 MB file
+(approximately 24.8 MB/second), and CommonMark took 3.72 seconds for the same
+file (29.2 MB/second). For comparison, MMD v5.4 took approximately 94
+second for the same file (1.15 MB/second).
+
+For a more realistic file of approx 28 kb (the source of the Markdown Syntax
+web page), both MMD and CommonMark parse it too quickly to accurately
+measure. In fact, it requires a file consisting of the original file copied
+32 times over (0.85 MB) before /usr/bin/env time reports a time over the
+minimum threshold of 0.01 seconds for either program.
+
+There is still potentially room for additional optimization in MMD.
+However, even if I can’t close the performance gap with CommonMark on longer
+files, the additional features of MMD compared with Markdown in addition to
+the increased legibility of the source code of MMD (in my biased opinion
+anyway) make this project worthwhile.
+
+Parse Tree
+
+MMD v6 performs its parsing in the following steps:
+
+
+
+Start with a null-terminated string of source text (C style string)
+
+
+Lex string into token chain
+
+
+Parse token chain into blocks
+
+
+Parse tokens within each block into span level structures (e.g. strong,
+emph, etc.)
+
+
+Export the token tree into the desired output format (e.g. HTML, LaTeX,
+etc.) and return the resulting C style string
+
+OR
+
+
+Use the resulting token tree for your own purposes.
+
+
+
+The token tree (ASTAbstract Syntax Tree https://en.wikipedia.org/wiki/Abstract_syntax_tree) includes starting offsets and length of each token,
+allowing you to use MMD as part of a syntax highlighter. MMD v5 did not
+have this functionality in the public version, in part because the PEG parsers
+used did not provide reliable offset positions, requiring a great deal of
+effort when I adapted MMD for use in MultiMarkdown
+Composer.
+
+These steps are managed using the mmd_engine “object”. An individual
+mmd_engine cannot be used by multiple threads simultaneously, so if
+libMultiMarkdown is to be used in a multithreaded program, a separate
+mmd_engine should be created for each thread. Alternatively, just use the
+slightly more abstracted mmd_convert_string() function that handles creating
+and destroying the mmd_engine automatically.
+
+Features
+
+Abbreviations (Or Acronyms)
+
+This file includes the use of MMD as an abbreviation for MultiMarkdown. The
+abbreviation will be expanded on the first use, and the shortened form will be
+used on subsequent occurrences.
+
+Abbreviations can be specified using inline or reference syntax. The inline
+variant requires that the abbreviation be wrapped in parentheses and
+immediately follows the >.
+
+[>MMD] is an abbreviation. So is [>(MD) Markdown].[>MMD]: MultiMarkdown
+
+There is also a “shortcut” method for abbreviations that is similar to the
+approach used in prior versions of MMD. You specify the definition for the
+abbreviation in the usual manner, but MMD will automatically identify each
+instance where the abbreviation is used and substitute it automatically. In
+this case, the abbreviation is limited to a more basic character set which
+includes letters, numbers, periods, and hyphens, but not much else. For more
+complex abbreviations, you must explicitly mark uses of the abbreviation.
+
+Citations
+
+Citations can be specified using an inline syntax, just like inline footnotes.
+
+CriticMarkup
+
+MMD v6 has improved support for CriticMarkup, both in terms of parsing, and
+in terms of support for each output format. You can insert text,
+delete text, substitute one thingfor another, highlight text,
+and leave comments in the text.
+
+Emph and Strong
+
+The basics of emphasis and strong emphasis are unchanged, but the parsing
+engine has been improved to be more accurate, particularly in various edge
+cases where proper parsing can be difficult.
+
+Fenced Code Blocks
+
+Fenced code blocks are fundamentally the same as MMD v5, except:
+
+
+
+The leading and trailing fences can be 3, 4, or 5 backticks in length. That
+should be sufficient to account for complex documents without requiring a more
+complex parser.
+
+
+If there is no trailing fence, then everything after the leading fence is
+considered to be part of the code block.
+
+
+
+Glossary Terms
+
+If there are terms in your document you wish to define in a glossaryThe
+glossary collects information about important terms used in your document at
+the end of your document, you can define them using the glossary syntax.
+
+Glossary terms can be specified using inline or reference syntax. The inline
+variant requires that the abbreviation be wrapped in parentheses and
+immediately follows the ?.
+
+[?(glossary) The glossary collects information about importantterms used in your document] is a glossary term.[?glossary] is also a glossary term.[?glossary]: The glossary collects information about importantterms used in your document
+
+Much like abbreviations, there is also a “shortcut” method that is similar to
+the approach used in prior versions of MMD. You specify the definition for
+the glossary term in the usual manner, but MMD will automatically identify
+each instance where the term is used and substitute it automatically. In this
+case, the term is limited to a more basic character set which includes
+letters, numbers, periods, and hyphens, but not much else. For more complex
+glossary terms, you must explicitly mark uses of the term.
+
+Internationalization
+
+MMD v6 includes support for substituting certain text phrases in other
+languages. This only affects the HTML format.
+
+Metadata
+
+Metadata in MMD v6 includes new support for LaTeX – the latex config key
+allows you to automatically setup of multiple latex include files at once.
+The default setups that I use would typically consist of one LaTeX file to be
+included at the top of the file, one to be included right at the beginning of
+the document, and one to be included at the end of the document. If you want
+to specify the latex files separately, you can use latex leader, latexbegin, and latex footer.
+
+Table of Contents
+
+By placing {{TOC}} in your document, you can insert an automatically
+generated Table of Contents in your document. As of MMD v6, the native
+Table of Contents functionality is used when exporting to LaTeX or
+OpenDocument formats.
+
+Future Steps
+
+Some features I plan to implement at some point:
+
+
+
+OPML export support is not available in v6. I plan on adding improved
+support for this at some point. I was hoping to be able to re-use the
+existing v6 parser but it might be simpler to use the approach from v5 and
+earlier, which was to have a separate parser tuned to only identify headers
+and “stuff between headers”.
+
+
+Improved EPUB support. Currently, EPUB support is provided by a separate
+tool. At some point, I would like to
+better integrate this into MMD itself.
+
+
+
+
+
diff --git a/QuickStart.html b/QuickStart.html
index ebb2b72..062d55e 100644
--- a/QuickStart.html
+++ b/QuickStart.html
@@ -253,11 +253,6 @@ OpenDocument formats.
Some features I plan to implement at some point:
-MMD v5 used to automatically identify abbreviated terms throughout the
-document and substitute them automatically. I plan to reimplement this
-functionality, but will probably improve upon it to include glossary terms,
-and possibly even support for indexing documents in LaTeX (and possibly
-OpenOffice).
OPML export support is not available in v6. I plan on adding improved
support for this at some point. I was hoping to be able to re-use the
existing v6 parser but it might be simpler to use the approach from v5 and
diff --git a/QuickStart.pdf b/QuickStart.pdf
index ef6aa0361e16aefe158fcfac856e9e9e29e2d433..d3f60d3e0222039757b52cb547c2de286812a3d5 100644
GIT binary patch
delta 5820
zcmai%S2P>|u!gN}1tEGb(HFbRVu`+pZk6cW>Md&2jozcT=tS=!2q8qzDv9VlBzi9)
z>dh_ZzTAg<{)d_WKXcB!&77|=2X8nFuQ44A5J@4Y#1@980a$s^`35FQx#E-|g%-UW
z&z}%1n%=Z_jXJ$x@_A=hma!0Q*@LTx?E=FVp^ff=pDoN`s+`p7Ivtj^DUE>@mLjpu(tPilu>iJC314BTTgvefrnfQ|E)
zk|{fV_%EZQFHe7Vrd#&pS|j9&h42v6Oc2%0hdojE!7vgXv^nOPIu}nxmeu~v;qY&@
zd8XfeL!hLrC^jD#4=K+bObaF~m924sj)$lZad}hVig;iJ
zrsKyE`_E=xtXPYc@nH3;j*2zHybH_LYaJz$`VUp$r~AlV-_rNhy3tB2Oi=SJ594J9
zT9&}Sa~Ym!nFNxCo54*&Hp)myE1Y6*nC!_9^2oZeG~7s)%HKg3!IRsMZGp%2V|3U+
zrMYE5^?F-a2AyFWIQU!pp7W(A1A)))UwFxEHoBGJ6J4Gb*>(HLFNTC~6{I|#q}QXe
z`h-TsibJg5HerW-IZre=JE6KdlhN5eP?d}+-2bD2&O7+}=AwI@=3Kfdc)8W5^K((x
z_UTEFas9cy>&fKfgNlJ7gHLwN?P>w~Ye#CtxmwJemgHh2bOD*Ozt2=xa*Dg@Y{NZq
z_L@2Ja9>y^EStnnK69Sve{U-un|w56XYImX*iM20`nJ52jUa!sMcMv=kc3=AfI@K}
zgslK(L%*58-WoPK6-UtW)p91<#8JqIlp6UmwROk_4;L75q;kKwu*lExRoC(Nz60zZbz~|WNAtVNMIO}wy;p7j_OE9N;(Lg_TWBqm@he=pyY{J~z}s@O?7w#y
z!>$3VGfjd+i{0|77R(Z_X+i+QtVxiFZ)M*o$|p8=B_u~nuIt_Y=1#x1
zLj*$c)_R@5eKaMBiBAh7;TA>ge-A5$qLVPRhJ)Np?X5os1H9>VD|F1o?71AI7qer3
z5TW?g5u
z(-&%+^uiIcLtjwAnjR=&t!G=JH#mdYM%7eE77lp}h75bzVm0|h-N8hO_f9f-LnN+O
ztb_p~UC{mXxf|ZFC`*Z~3yK?11Lf%Yg~xmjEj#T5iZ=*#Sg1^&$&^c>9Csh5%Zi!L2mcY2
zrF^sk($vqp?8`mywK#JMlK1zU`;x3qH^J|_^kujxiq^*~Om^8eX(J7fUeqBGcVGus
z6S!*V)IC`+Cj5MiU?!a_?fl-#?@S2s%2ES}a7tASoAd=(16TaB|vtZL6s6fzbgD-3iBFW_9pv%SLG=ZECSymc^?
zRW;6HRCLNVN{K2X|0NX~kTF|i?-)Tb)m(qJt{7by)HO!8N>3X9zAx!$9OHf0A;W(=
z^>cAxo1G;e=tBQ;5WRjAw53-bPb%{@kW+G6!uFj*Z8A|M>6Q
zi2g=~yAM7JjJ}n4()*0^i=bpi=BAYOZQtsHocU4yS8UP#V>hsPXBHU)?%{_wLv$G*
z8$$%S5!8)RvnNLU?_+qHGPSlr=(iVVR)w}PAXm{rzc@LFMEAiTPefCH@SFf9NCe@c
zmL>E#z2ObUEvMP3m2{Oq3Z-*dpqBEq>40tDA9?xxG>Oth>ec8)rEd+JREc7p2muUR*~7qTx=kO3EuYodMu}i8m&%Dxi+Y8%JCUd2
z2JH>Ri^#0*X53j1C;eSSmj+);bqZn@Pss8tE--tYXSD`P#~3;DKlNwi1U+N7$A>{1
zLg6AhtmUk&@&f7cAnQ5`Jr!0F!Uq-{-5!+ol%pfmA(;*(%-}RP9>S8H6?s)%
zY|EFe?ShilVUN!-*oCAl?nEmd(sc*2Uos|L96v`y`2-C{C#a$qKLmL&>D4*^ZGq+J
zKP0lv4@D*?R9~^N<)~slX7BIPnueDFKRfZuRdzSj`z*ih_~5hmqJNhFQAN1=E>*H<
zy0HLwjQq7z33Z*`@OvRWdcTd{T}@?wZ|yy>6X%|vgh93$gfOC+GM9x|FvtR#d1+$4
zc*44IcsjOtLlIg;A$IeV0-z@A@V$wl$PcY7GmnH3#y6^(L{oM=3&>Kq;iQ$2;nCrc
zWj9+d59Mp}4^@i!``a-z+B6$I3Y?kof2!08W|=Od4Oq^E+De0-4Sq{9C_Nn0@H?N~
z@OOnUekCWw$@hYCs8F;F-rgk3+$V&+HRYGgK;)XX?)T#upk4gyWLIL($_~Boqwb|;2);62#$jC6Q!alOU-(#7R=!^NnqqN1vjZhsn(hoE`Rk
zj6<(}7`AvXCm3C-?M>OdWm)GwtK@YMNF9lf=~h7ptDZBjFlmcA9{hM~{?S{Aeu#(W
zM)oYby6g$JXJojhgY?x?DOfG#I`CHms6uTrCTgx+r3;T!Q;Q#e
zQEX?3Lwt5V;|p_(>vHO-^k&E%^0_|G+M3^q@`pnY}KjUsx%
zzwH8ZGIEx7+h^qm-ZnpvpUoYT#Gp!N^>gD^1c?+ERkR|7dnbV0CSN`peMfK@f(3d@
z+=yp>ONI1$6}X*Z?zi$R*0aYNUKOI(aYFi{gXUN^Kds^2-;XN?jSl_Y3K|}|6Z-V)
zH;gpv({1UR->vXN_(M)ooDpn(s1m(%b$64NMbPY2Z5trG(y44x=_(4-v5weN(MS5BGx}|yTq^Lf7&i|yH|U^QObDOcCe8azU7{@qQ&IaNo%^a
z;VkasI?4Yfy|biMfH(%c;ew{rFdp|^T}fAM%Nv_O1O;$rdLg244W@md1ZL@RL!RY%5g1?L^A}3O>
zERdTtTjBk4rh1=toKzcP_VUsn;LfAUWl4TA2Z#Gd6ZB~<-CR#6Z%+PZSK8T>+;3)!
zJCEHhq<+@GR&GGO!`Nm;M`P(Y8C7KBkqC}}grd9FOJqKUY2RTmj6c3V+0fO8<7vVY
z^O1#ZiEWe$8v#6~PH1wc=;~hmnR49ZQ*2Z?A5%Hy+f-guET4rQo#^k$Umr)SRJ2{N
znY?^ox)+U?AM^&*UP!bl8>S!RhgOO_i8X3*wa@EtL%nT9+WCzf34hfheKrP&F=@>p
z*tRL6VuGk6`<=I?0O6_v+ux>?W2N|WHs*%UxENnW#(EqXRT
z(i5WM*x+9^qF2{JG-=-j1k+m$(M8TqkySFCU15Axt!Acc`)
zc@(SYBu%XV@I-vJyfX0|;j79fum7&-K4AItPL@}^sEhqs4~3acyHhC`;Sk=4aIo<}
zI4B$=2+;!aSaR|H>SF;U6P~g!IfBP?xk|OTTi`{F`4VELW$z
zP;kw5EFg&VKnVzoX^{!gp{E6Wqx>S2DIS_#%7q=9jRNw-@vU
zc(NPMxghI`G0_%w243V@sJ-mtB#Hc3HDaJ1
z{_`+Mg4b8!vD&twE4xZA>5`m4F;3vOOKUL(;{Eum#Y+fl_5iBL=ZJdbTjyoGEze4{
zA~dh@ngWHtyR_@Y!R4@b{*kEe_*z2?Pioe`Drp{`0-Ov`G_`?$j$j%|Vx
zhp|vCKCIem&$9W1wjYYU+NM6$E^v)n4K5eOeOpsbZlj-kGCYEw_r7^rKQ?n0gA9X9
zdZwQ8-x51$M|b^SZiGUiS?MYOcC@e=P)OG?;2+LGg@Hl_tR@gvVOGe$P{-Zf`(FrV
z1+(e^g;d<^-2XYq|2PDz$uo!uSQsWJsss~(!yrnEPzA7<{J$axmPf!vVe(*U*8hLR
z?9u;nAq*;-C8rADMKh(1=;+GPMm{Jtl*r1{Vu#Uk$jc&R)d}VB?DLQ>d;ED;dm{DS
z%uLE8YsQJM9tj4K83+aw)---@{=2)^Ef(B)lZWWPax;j~4DrMP}R15O0=_8H+$p3!&bah%ON`8Jo$fbK^(lwq!JG
z%wIRdTrymmTSHyET6|Q9=KDoOpG|q
zYq;4siIm7cbsAwCj29H`j|9VrpNYqr^_suVTBGtZ&2N`@319aV!Ho))L1^R2QIR?U
zKw+F7^q_EIbPO!URsu?{;ff&Rf)m6uVOd582NibqX>{ZHCs(i$=yUvi;m0Z
zwz_v$SC|>ilaJOW8YjVHGb$$=@dEZOCT+;aDP_YtwojoHbR%?d=8|bqR*saE;pdNS
j-{q$-u&|en6`ruvdIw!+`Kbe#fe;uB$jPawr3CyB1tj21
delta 6052
zcmai%Ra6v!v&LOY8kQ2tr8|~fI+qlXPU)qWMY@*;>29P`q!#HEB_yO#QdGKx1!Y0t
z`oHI%`*I)dnV0$Id^3+T^Bd2@EiJ%p$rc8PX8qQ?UfM3PKx@+8EhS
zdy<&-ac8ztE+nRLFNs?-S{;*-n8tpMV7HvGqY?Vdhz@9g}32_0YiWH^m`zLg(32Xru5ft
z5H6|N+vVHaKZiT|nqJ=ogcB9*>Ts%<7@vMRd1$mYy+g+NYgy~;<>PaIRA1?Y`}{m~
zSYue49P@r1H|%Yl9&uk8exs$)uzCHOH!MhEQondNV>TWT&7P9-sp03PrU&KzPyBgX
zyf2lk%iS%WhXQLs$EmDT(Y6A+^j`{bK5M-+H=Ztb9M+V%kWH&7J9uZDvbl)feeT^6
zw{c^o9<+sQSaEu@tYY(W*+gC)|JCzMyHYmIxcBSgxPZll)5ah3)y9qMSAFj26Hl5pDB_cKOGjWNH3+w$c2wR68s60^qh&)Q>;^Gq+d{##VBnlVKJ59;YiN@W7Tt+
zJc?a!jwH@WW4fW6rg|xy!QNRK-|Njo#ZKdH8uP#NA8BVeGg?n>|LlzPGAqo0^<{mr
zxqho7#IGr%ml(yT-~V;O4=A6VRx-`j84v%4{Lc8cUPI*tL#Bh6Mx{k7NQ!X|(IQx>
zAZ_~L<8RGG24J$#)n{62sh1+AA0(B#64rT9erDMCY3O{M%O|00zpn~WHG+Jj;;M}(
z<2rrmllr&_`B$EBscF3&rW=WryYlL*5R&z}y&wD$7Pm25NlKS2AP}3+E_~_h?9=ZrmBv`6L$*uz`lPY0!%iG2
z`gFF~g~;#`Q{!XNP|npaJl=dBzj0}K`ik|y$;7WXUj58@>4AS7TOJD^a@PL6BxZuY?jT6zoJ9Jew3SstJ?G6J0oQPL5u~xaT
zj+Q?$c95{B?Jcbn0~Z4k_uyKFU75e5=wl
zYk;PR1p9eQ?S{#nkn5Zvh(n};11LG8CW9Bxt!eI-L7(;J1xM6w*gaB^$P$u@E&J$R
zA7k|P!WN?BX71`&lfoyertT1UQ0rE8W(JKD!sSg6yP5_dI5Cm`HG7VbZl5b}k?vCl
z!kxa-QSRuF=P?Gw)~v;}w65S)7^krUu9Zym>`yJ5R)mmXb+O@^GGrrVipIlXDp!B*
z32VMVqP^O4QqkiNr^CIDv{2gJKXXlTd+3SYpMW9z{ns7VV;gYzTPl9
z_PL||n(8&RVurHtsah68C(VMeO#S(Guo_uGXp(y^@o8(gu&uGAa^f2Ul$*k9mpT%?c<8@1W5>r2!iuwqycQYQD_S
z;|3$aL^@3?LxxxeDgW@hfzhe-5tS;cH+|}Gd&2zJc)xBGB_krmatSz791I?3zvdCr
z$8(Btns;-0XD2UmL_!oLMd0b4k212@t*})RX@+uf@5<>b0W&n6&DsgW$_1;D!$ibo
z!cpyIE@><;>>q!%dlnC5_ai5ku2tlEd8)mWetMHRou&HUBC28
zUSUQ7uZl?E5a+q5!9nUG1vLc{_$@iP4u33pz78jeu+ZRD>#UAy?B)Apf`~L$EHY}4
zy{f~zqwz-)?qy6aYi4z7YV8SC-F5lm>4p_0SGj@2yph&Y`Px7qTU~b@Lf8yXG8>i8
z@W)gN;ik6BPhfJUfj@u($C?nlRtS&p*Y3205YE~j3UDPS-vqV9pnNd3Ka+2B+
z>CG#evhtz*iF+5u=<-Omq!`QLH2Zc(?tOKQOWi~Y7nXCqbS|wrQ|?*09DoZYl>P$0
zEMh6b)Znq;T!b->oqnYtE1tw
zW4|wOZkx*n;WOG9H&P*f{Odtm2*%&l6GM|
zq5F>XDbEI^l)!~-vp^HKGtW*Az>XY5s8=YDv#ObxI4O-ZSAUL(;;BX1ZuD!AlKPjD
z#z=^;NiND0d5J!gur2SV6NQZZ8U6<2v<)(YP*OG6JMk29)3WEsD}RC2&KnG>CnK+K
z6=)f@WO8sTzy9(RhV24Vi;!;&h9ZdafkpYcKeHW_iJcn#NBg3$$
zWV@ok1BS$jbLa5RJhpU>(-BYe-Ab1CmcgNz>QFx`|H)$Ge!pvLFn?ChAM%ON>5lmE
zBj^kDk1PEr`XG}f?9rd`l@$TSBNenR0cq!1f3+uOoJxMSgyaN7c$n>ucqe~QG(StQ
zva?!G3C2Kn5>=(gg>E)Zz9WgWXQCe^dewa+i{AjQ8fa*HOq`6;W?#@Nm0z0VT%joa
z%r$w!&{h)xzr{THb3RkGZ%0kYx{j_+vDtL*?_*@9o#Es&vM4PW#X><}E)6LtocR$s
zQvt<+iL=G?@s<4bY(IF-k`0mDBpx)=*1I8CKtz=k=F&D>!Q+%Ff-Hm@CEa+is%1tY
z`U5lYzFGFS*$`vE$dGouLFW}%kj#A~`b~IHSitM6MEY>4@ySg;`R|Hd1&^nD9W5o^?wITV
z^Pz_0L7_C9?sWCg(C19$9OqW7=QsjPxHx83OA)UomB~qv@c!;f4AKGf%INH$zdL|iHH69_sM4O
z=}9n0e{wP0E>_X_{iVtgc%=3Cfx->r(H9F9z4I-=r*E6GlRV5;T(5wWv|;fdaVrM~
zDBz(<3h-}j_zyF@Te||<%}LCr9GJC^l%Jd!7LYc{oRT%m@7j2(V*-~=vtJ1NpprrWQk?Yvkj^m9+TarA@lOqcX$>(ct
zCfDYcq-08Lzx87F!i5xq--W5YC<#uhzBb>>CVf&|C90|%VdQ_fk8}JmSbNVgZLz2<
zows!G!Ayj@l`p$+j-^TiSyJ{f2|JCN8j5Q%%KtDZ-KQ#xikidJj~Z3^UlQSMVp~)k
zxe=#yBX!xxk#0$uuZtv(!d;7dbkHh)t0?EiXeNF_RX3`nIfBW~NX;bX2-5(fbys~zNf2G=1+3dwrPu1l-VqI`9ufx?@{Ao`(touj9rN5(j*#`4YIJ29c}
zwYB1u@t?$A4Gy$m^ABDV|N=c>T;F3QKNlDd|yv!I$khWG_?qF*O
zM&47FHjKfKvR4g?F5TCZ>ou8O!^B<$KVM#*9_!bC=-^i~rn!9=5-mA+G8lS?{*5k)
zjt=AbWk1_bCu;c8qn2cg^RH)?FHbChR+}j6?aQ=|Fu^FF+K^kr&B2~ghgpq*pes+q
z`N_LBnf*TROG3Xe|H(n{IBDCa*%TrB~}6I*_@^4Z}d|`WmfAz$5(UDM-TJ8
zoy7eHHDt~@!lmSc!ZVSOV^X}0r10}#bf9y$$EA{|;asP5xr_8cy%*=T`L?4rM3S%2
z1&64H!)y^g+|xHE6gab>9sc#97_IGr!cd=~^+Jab*Xd-pBgIephPJja327Jz@}Zav
z)AbOW*Vi|?o0*5C`kRW}MgCGi>x18LKG2FY4kD2k7q%ukInNNIA%9$m+>3N>4ym?-
z=f>;X`r1T4v99T5$3kz5xjwvNi^&~`ayv@Oo~2;67b0X}X8U#DEc5uxMt*BXedEWe
zSLk!%r0L4ek0E(hS8ns
zXSJlAFNg(C&&7{>zPY!3dZE9Ti>sRdQX-L4z_}OUIsfOl9)&5WL&q^sYt=BbeSPys
z0eOAkWg>FXXbg@YXcPLtAmm)DPY$1m3f5SB*(&gbW=r?Oj
zUUXwMX)rWn_
z*3Q}!spV8^CGeg4`msCGPvRf^IlNuzmU>^|@tIh)xAI&&@5kDOqR{bzG{AJp8FY_iZ91`%|}TAhdGRjVZn4*X7!uSz^}O%or^bl_qb5Z
zjeAMm;6?q7bb@D7+T!Km+Wyx>mY-oNi|So(R&U}uF$rd2amDTzyG;zBC&}&{t-R74
zj9}xVs>9E^bia|>S|RV0I`bR2RHKcSEfg4bN)MWBER&24=frZtjTdh2r<;9w8!zn@
z=5=o7-rQuo4bR=qXgJ_%+8^xnsi8#mWi@P1)kG{C3D2T7DmsI#{MC2xXp|?+
zKL2iAEk9##BP=9Q@~GY}M4I_$qZk=jab=Jlc@*$c@2+JfBM4>zUp1>L-hp
zE@@hf4HCjCF%t0{QSLwn;3`B8_+GZosV~l1sw|?zqFp+P{-DX5b@px2+aHwn8HQRt
z@xbG3uj`8?wVoE4@@LJq^Rb(-A>mX0J*>XnTN8(f%i_yg%a|&KCD!!&WDlSQvSTCW
za&KL>!3o**Zz_|4UtK)?-a*LW7R7iFg_@u9&mJeF2oBi$$yh%+
z<)^($;3MV@SSag}Da9J0svks5&$A%XwfBdt4r)@mNt|DY0Yh%(=we_kAQj;xUzhb>
zsEDui)>S@>N|HQ(=Js8UwR2JJE#Mj4r}>>A;zj{`bkMkKgs{aOA!$!peZX$C}b4m1p^7?ebxW~k>W21g$!MT|AC;$
zKe{soS%N{LAn?DU0RrLsuPE}b&wx-!)6)s@Pl^7IQUzJcN-Bwgm83+)#lXVKDyqs*
z2@xm+BB~;)q9hJg0V@m3gZ_WZ3zGjON^ucM(0>ypN0zpMp%QKEgIaTiA{GFPkd{q3
zDj_0)1&3kh~ACJ`#%s2!eB#Vbjsv3(OvQy?WRd!cKB_)OfNZt@#7yygg6H_guTE$#o!*>VupH8oL~&ZR`NK(K
zD3qJk5!i-r9>cF}!Uw&LH#OI6HEexn7<%t$sdK)QC%}cidpKV)_P{XlmBYX8q!_`OV9uUYMo|IRn4PYV^m5?Ij;DG9>
G5&joZD_42|
diff --git a/QuickStart.txt b/QuickStart.txt
index dae3a65..017c75c 100644
--- a/QuickStart.txt
+++ b/QuickStart.txt
@@ -242,19 +242,13 @@ OpenDocument formats.
Some features I plan to implement at some point:
-1. MMD v5 used to automatically identify abbreviated terms throughout the
-document and substitute them automatically. I plan to reimplement this
-functionality, but will probably improve upon it to include glossary terms,
-and possibly even support for indexing documents in LaTeX (and possibly
-OpenOffice).
-
-2. OPML export support is not available in v6. I plan on adding improved
+1. OPML export support is not available in v6. I plan on adding improved
support for this at some point. I was hoping to be able to re-use the
existing v6 parser but it might be simpler to use the approach from v5 and
earlier, which was to have a separate parser tuned to only identify headers
and "stuff between headers".
-3. Improved EPUB support. Currently, EPUB support is provided by a separate
+2. Improved EPUB support. Currently, EPUB support is provided by a separate
[tool](https://github.com/fletcher/MMD-ePub). At some point, I would like to
better integrate this into MMD itself.
@@ -267,4 +261,3 @@ better integrate this into MMD itself.
[?PEG]: Parsing Expression Grammar
[?AST]: Abstract Syntax Tree
-
--
2.40.0