set (My_Project_Title "MultiMarkdown")
set (My_Project_Description "Lightweight markup processor to produce HTML, LaTeX, and more.")
set (My_Project_Author "Fletcher T. Penney")
-set (My_Project_Revised_Date "2018-03-28")
+set (My_Project_Revised_Date "2018-09-01")
set (My_Project_Version_Major 6)
-set (My_Project_Version_Minor 3)
-set (My_Project_Version_Patch 2)
+set (My_Project_Version_Minor 4)
+set (My_Project_Version_Patch 0)
set (My_Project_Version "${My_Project_Version_Major}.${My_Project_Version_Minor}.${My_Project_Version_Patch}")
<office:meta>
<dc:title>MultiMarkdown v6 Development Notes</dc:title>
<dc:creator>Fletcher T. Penney</dc:creator>
- <meta:user-defined meta:name="date">2018-03-38</meta:user-defined>
+ <meta:user-defined meta:name="date">2018-09-01</meta:user-defined>
<meta:user-defined meta:name="uuid">dd2d8e76-dc2d-416d-9acd-5395d20871c2</meta:user-defined>
</office:meta>
<office:body>
<office:text>
-<text:h text:outline-level="3"><text:bookmark text:name="introduction"/>Introduction </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="introduction"/>Introduction</text:h>
<text:p text:style-name="Standard">This document includes some notes on the development of MultiMarkdown (MMD) v6. Most of it
will be interesting only to other developers or those needing to choose the
absolute “best” Markdown (MD) implementation for their needs – it is not required
reading to understand how the software works.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="whyanewversion"/>Why a New Version? </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="whyanewversion"/>Why a New Version?</text:h>
<text:p text:style-name="Standard">MultiMarkdown version 5 was released in November of 2015, but the codebase was
essentially the same as that of v4 – and that was released in beta in April
into parser code. It worked well overall, but lacked some features I needed,
requiring a lot of workarounds.)</text:p>
-<text:h text:outline-level="3"><text:bookmark text:name="firstattempt"/>First Attempt </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="firstattempt"/>First Attempt</text:h>
<text:p text:style-name="Standard">My first attempt started by hand-crafting a parser that scanned through the
document a line at a time, deciding what to do with each line as it found
<text:p text:style-name="Standard">In the end, I scrapped this effort, but kept the lessons learned in the token
pairing algorithm.</text:p>
-<text:h text:outline-level="3"><text:bookmark text:name="secondattempt"/>Second Attempt </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="secondattempt"/>Second Attempt</text:h>
<text:p text:style-name="Standard">I tried again this past Fall. This time, I approached the problem with lots
of reading. <text:span text:style-name="MMD-Italic">Lots and lots</text:span> of reading – tons of websites, computer science
about how to create the grammar used. But so far, it has been able to handle
everything I have thrown at it.</text:p>
-<text:h text:outline-level="3"><text:bookmark text:name="optimization"/>Optimization </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="optimization"/>Optimization</text:h>
<text:p text:style-name="Standard">One of my goals for MMD 6 was performance. So I’ve paid attention to speed
along the way, and have tried to use a few tricks to keep things fast. Here
are some things I’ve learned along the way. In no particular order:</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="memoryallocation"/>Memory Allocation </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="memoryallocation"/>Memory Allocation</text:h>
<text:p text:style-name="Standard">When parsing a long document, a <text:span text:style-name="MMD-Italic">lot</text:span> of token structures are created. Each
one requires a small bit of memory to be allocated. In aggregate, that time
downside is remember to check for a single space character in a few instances
where it matters.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="properinputbuffering"/>Proper input buffering </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="properinputbuffering"/>Proper input buffering</text:h>
<text:p text:style-name="Standard">When I first began last spring, I was amazed to see how much time was being
spent by MultiMarkdown simply reading the input file. Then I discovered it
experimented with different buffer sizes, but they did not seem to make a
measurable difference.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="outputbuffering"/>Output Buffering </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="outputbuffering"/>Output Buffering</text:h>
<text:p text:style-name="Standard">I experimented with different approaches to creating the output after parsing.
I tried printing directly to <text:span text:style-name="Source_20_Text">stdout</text:span>, and even played with different
buffering settings. None of those seemed to work well, and all were slower
than using the <text:span text:style-name="Source_20_Text">d_string</text:span> approach (formerly called <text:span text:style-name="Source_20_Text">GString</text:span> in MMD 5).</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="fastsearches"/>Fast Searches </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="fastsearches"/>Fast Searches</text:h>
<text:p text:style-name="Standard">After getting basic Markdown functionality complete, I discovered during
testing that the time required to parse a document grew exponentially as the
This allowed me to get MMD’s performance back to O(n), taking roughly twice as
much time to process a document that is twice as long.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="efficientutilityfunctions"/>Efficient Utility Functions </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="efficientutilityfunctions"/>Efficient Utility Functions</text:h>
<text:p text:style-name="Standard">It is frequently necessary when parsing Markdown to check what sort of
character we are dealing with at a certain position – a letter, whitespace,
slightly differently under different circumstances. I also suspect it
improved performance, but don’t have the data to back it up.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="testingwhilewriting"/>Testing While Writing </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="testingwhilewriting"/>Testing While Writing</text:h>
<text:p text:style-name="Standard">I developed several chunks of code in parallel while creating MMD 6. The vast
majority of it was developed largely in a <text:a xlink:type="simple" xlink:href="https://en.wikipedia.org/wiki/Test-driven_development">test-driven development</text:a> approach.
broken. At this time, there are 29 text files in the test suite, and many
more to come.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="otherlessons"/>Other Lessons </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="otherlessons"/>Other Lessons</text:h>
<text:p text:style-name="Standard">Some things that didn’t do me any good….</text:p>
the tools to measure whether I could have improved memory usage at all. Not
sure this would be worth the effort – much lower hanging fruit available.</text:p>
-<text:h text:outline-level="3"><text:bookmark text:name="performance"/>Performance </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="performance"/>Performance</text:h>
<text:p text:style-name="Standard">Basic tests show that currently MMD 6 takes about 20–25% longer the CommonMark
0.27.0 to process long files (e.g. 0.2 MB). However, it is around 5% <text:span text:style-name="MMD-Italic">faster</text:span>
I’m sure there’s still a lot of room for further improvement to be made.
Suggestions welcome!</text:p>
-<text:h text:outline-level="3"><text:bookmark text:name="testing"/>Testing </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="testing"/>Testing</text:h>
-<text:h text:outline-level="4"><text:bookmark text:name="testsuite"/>Test Suite </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="testsuite"/>Test Suite</text:h>
<text:p text:style-name="Standard">The development of MMD v6 was heavily, but not absolutely, influenced by the
philosophy of test-driven development. While coding, I made use of test
identified. This helps make proper integration testing of the entire
application with every release.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="fuzztesting"/>Fuzz Testing </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="fuzztesting"/>Fuzz Testing</text:h>
<text:p text:style-name="Standard">I was not familiar with the concept of
<text:a xlink:type="simple" xlink:href="https://en.wikipedia.org/wiki/Fuzzing">Fuzz Testing</text:a> until a user mentioned
sometimes identified. I have found some interesting edge cases this way.
Definitely a useful tool!</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="unittesting"/>Unit Testing </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="unittesting"/>Unit Testing</text:h>
<text:p text:style-name="Standard">Some of the original development was done with unit testing in some other
tools I developed. This code formed the basis of a few parts of MMD.
the development of MMD. So there is really not much unit testing built into
the code or used during the development.</text:p>
-<text:h text:outline-level="3"><text:bookmark text:name="dependencieslibraries"/>Dependencies/Libraries </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="dependencieslibraries"/>Dependencies/Libraries</text:h>
<text:p text:style-name="Standard">MMD v6 has no external dependencies when compiling, aside from the standard
libraries for C development (Except that it will use <text:span text:style-name="Source_20_Text">libcurl</text:span> if available in
</text:list>
-<text:h text:outline-level="3"><text:bookmark text:name="changelog"/>Changelog </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="changelog"/>Changelog</text:h>
<text:list text:style-name="L1">
+<text:list-item>
+<text:p text:style-name="Standard">2018–09–01 - v 6.4.0:</text:p>
+
+<text:list text:style-name="L1">
+<text:list-item>
+<text:p text:style-name="P1">
+ADDED: Add ODF Header metadata and fix issue with LaTeX Header metadata</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+ADDED: Add additional tests for special characters</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+ADDED: Add initial OPML export support (address #9)</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+ADDED: Add opml option to read for MultiMarkdown OPML files</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+Add missing Latex support files</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+Avoid potential error with stack_free</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+CHANGED: Remove unnecessary code</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Allow caption without trailing newline at end of document</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Escape square brackets, e.g. ‘{[foo]}’ (addresses #128 and #129)</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Fix escpaing of % character in LaTeX code spans and blocks</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Fix html comments inside code blocks (fixes #118)</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Fix issue where <text:span text:style-name="Source_20_Text">~</text:span> is mistakenly interpreted as fence delimiter</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Fix issue with BOM and files > 4k</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Fix issue with dollar math delimiters inside code (fixes #134)</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Fix token length in OPML</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Improve OPML export; add OPML tests</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Normalize line spacing in CriticMarkup notes in LaTeX (fixes #120)</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Preserve tabs following leading hashes in code blocks</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Prevent potential null dereference</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Remove lock file</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Trim single remaining whitespace when exporting headers</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Trim trailing newlines in definition blocks</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Use Setext headers when necessary to convert from OPML to text (fixes #138)</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+FIXED: Use \ul instead of \underline when soul package is in use (fixes #121)</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+Merge pull request #132 from jlargentaye/develop</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+UPDATE: Clarify DevelopmentNotes re: libcurl</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+UPDATE: Clarify README re: libcurl</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+UPDATED: ‘\item{}’ no longer needed since square brackets escaped on their own</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+UPDATED: Add 6.3.1 release notes</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+UPDATED: Add allowfullscreen to list of boolean HTML attributes</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+UPDATED: Add more BibTeX test cases</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+UPDATED: Adjust metadata for test files</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+UPDATED: Allow '' to preserve line break in metadata. (Addresses #86)</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+UPDATED: Apply astyle</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+UPDATED: Fix whitespace with boolean HTML attributes</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="P1">
+UPDATED: Ignore escaped space at end of code span</text:p></text:list-item>
+
+<text:list-item>
+<text:p text:style-name="Standard">UPDATED: Test % escaping in URLs</text:p></text:list-item>
+
+</text:list></text:list-item>
+
<text:list-item>
<text:p text:style-name="Standard">2018–03–28 - v 6.3.2:</text:p>
<meta charset="utf-8"/>
<title>MultiMarkdown v6 Development Notes</title>
<meta name="author" content="Fletcher T. Penney"/>
- <meta name="date" content="2018-03-38"/>
+ <meta name="date" content="2018-09-01"/>
<meta name="uuid" content="dd2d8e76-dc2d-416d-9acd-5395d20871c2"/>
</head>
<body>
-<h3 id="introduction">Introduction </h3>
+<h3 id="introduction">Introduction</h3>
<p>This document includes some notes on the development of MultiMarkdown (<abbr title="MultiMarkdown">MMD</abbr>) v6. Most of it
will be interesting only to other developers or those needing to choose the
absolute “best” Markdown (<abbr title="Markdown">MD</abbr>) implementation for their needs – it is not required
reading to understand how the software works.</p>
-<h4 id="whyanewversion">Why a New Version? </h4>
+<h4 id="whyanewversion">Why a New Version?</h4>
<p>MultiMarkdown version 5 was released in November of 2015, but the codebase was
essentially the same as that of v4 – and that was released in beta in April
into parser code. It worked well overall, but lacked some features I needed,
requiring a lot of workarounds.)</p>
-<h3 id="firstattempt">First Attempt </h3>
+<h3 id="firstattempt">First Attempt</h3>
<p>My first attempt started by hand-crafting a parser that scanned through the
document a line at a time, deciding what to do with each line as it found
<p>In the end, I scrapped this effort, but kept the lessons learned in the token
pairing algorithm.</p>
-<h3 id="secondattempt">Second Attempt </h3>
+<h3 id="secondattempt">Second Attempt</h3>
<p>I tried again this past Fall. This time, I approached the problem with lots
of reading. <em>Lots and lots</em> of reading – tons of websites, computer science
about how to create the grammar used. But so far, it has been able to handle
everything I have thrown at it.</p>
-<h3 id="optimization">Optimization </h3>
+<h3 id="optimization">Optimization</h3>
<p>One of my goals for <abbr title="MultiMarkdown">MMD</abbr> 6 was performance. So I’ve paid attention to speed
along the way, and have tried to use a few tricks to keep things fast. Here
are some things I’ve learned along the way. In no particular order:</p>
-<h4 id="memoryallocation">Memory Allocation </h4>
+<h4 id="memoryallocation">Memory Allocation</h4>
<p>When parsing a long document, a <em>lot</em> of token structures are created. Each
one requires a small bit of memory to be allocated. In aggregate, that time
downside is remember to check for a single space character in a few instances
where it matters.</p>
-<h4 id="properinputbuffering">Proper input buffering </h4>
+<h4 id="properinputbuffering">Proper input buffering</h4>
<p>When I first began last spring, I was amazed to see how much time was being
spent by MultiMarkdown simply reading the input file. Then I discovered it
experimented with different buffer sizes, but they did not seem to make a
measurable difference.</p>
-<h4 id="outputbuffering">Output Buffering </h4>
+<h4 id="outputbuffering">Output Buffering</h4>
<p>I experimented with different approaches to creating the output after parsing.
I tried printing directly to <code>stdout</code>, and even played with different
buffering settings. None of those seemed to work well, and all were slower
than using the <code>d_string</code> approach (formerly called <code>GString</code> in MMD 5).</p>
-<h4 id="fastsearches">Fast Searches </h4>
+<h4 id="fastsearches">Fast Searches</h4>
<p>After getting basic Markdown functionality complete, I discovered during
testing that the time required to parse a document grew exponentially as the
This allowed me to get <abbr title="MultiMarkdown">MMD</abbr>’s performance back to O(n), taking roughly twice as
much time to process a document that is twice as long.</p>
-<h4 id="efficientutilityfunctions">Efficient Utility Functions </h4>
+<h4 id="efficientutilityfunctions">Efficient Utility Functions</h4>
<p>It is frequently necessary when parsing Markdown to check what sort of
character we are dealing with at a certain position – a letter, whitespace,
slightly differently under different circumstances. I also suspect it
improved performance, but don’t have the data to back it up.</p>
-<h4 id="testingwhilewriting">Testing While Writing </h4>
+<h4 id="testingwhilewriting">Testing While Writing</h4>
<p>I developed several chunks of code in parallel while creating <abbr title="MultiMarkdown">MMD</abbr> 6. The vast
majority of it was developed largely in a <a href="https://en.wikipedia.org/wiki/Test-driven_development">test-driven development</a> approach.
broken. At this time, there are 29 text files in the test suite, and many
more to come.</p>
-<h4 id="otherlessons">Other Lessons </h4>
+<h4 id="otherlessons">Other Lessons</h4>
<p>Some things that didn’t do me any good….</p>
the tools to measure whether I could have improved memory usage at all. Not
sure this would be worth the effort – much lower hanging fruit available.</p>
-<h3 id="performance">Performance </h3>
+<h3 id="performance">Performance</h3>
<p>Basic tests show that currently <abbr title="MultiMarkdown">MMD</abbr> 6 takes about 20–25% longer the CommonMark
0.27.0 to process long files (e.g. 0.2 MB). However, it is around 5% <em>faster</em>
I’m sure there’s still a lot of room for further improvement to be made.
Suggestions welcome!</p>
-<h3 id="testing">Testing </h3>
+<h3 id="testing">Testing</h3>
-<h4 id="testsuite">Test Suite </h4>
+<h4 id="testsuite">Test Suite</h4>
<p>The development of <abbr title="MultiMarkdown">MMD</abbr> v6 was heavily, but not absolutely, influenced by the
philosophy of test-driven development. While coding, I made use of test
identified. This helps make proper integration testing of the entire
application with every release.</p>
-<h4 id="fuzztesting">Fuzz Testing </h4>
+<h4 id="fuzztesting">Fuzz Testing</h4>
<p>I was not familiar with the concept of
<a href="https://en.wikipedia.org/wiki/Fuzzing">Fuzz Testing</a> until a user mentioned
sometimes identified. I have found some interesting edge cases this way.
Definitely a useful tool!</p>
-<h4 id="unittesting">Unit Testing </h4>
+<h4 id="unittesting">Unit Testing</h4>
<p>Some of the original development was done with unit testing in some other
tools I developed. This code formed the basis of a few parts of <abbr title="MultiMarkdown">MMD</abbr>.
the development of <abbr title="MultiMarkdown">MMD</abbr>. So there is really not much unit testing built into
the code or used during the development.</p>
-<h3 id="dependencieslibraries">Dependencies/Libraries </h3>
+<h3 id="dependencieslibraries">Dependencies/Libraries</h3>
<p><abbr title="MultiMarkdown">MMD</abbr> v6 has no external dependencies when compiling, aside from the standard
libraries for C development (Except that it will use <code>libcurl</code> if available in
TextBundle/TextPack, OpenDocument, etc.</p></li>
</ul>
-<h3 id="changelog">Changelog </h3>
-
-<ul>
+<h3 id="changelog">Changelog</h3>
+
+<ul>
+<li><p>2018–09–01 - v 6.4.0:</p>
+
+<ul>
+<li>ADDED: Add ODF Header metadata and fix issue with LaTeX Header metadata</li>
+<li>ADDED: Add additional tests for special characters</li>
+<li>ADDED: Add initial OPML export support (address #9)</li>
+<li>ADDED: Add opml option to read for MultiMarkdown OPML files</li>
+<li>Add missing Latex support files</li>
+<li>Avoid potential error with stack_free</li>
+<li>CHANGED: Remove unnecessary code</li>
+<li>FIXED: Allow caption without trailing newline at end of document</li>
+<li>FIXED: Escape square brackets, e.g. ‘{[foo]}’ (addresses #128 and #129)</li>
+<li>FIXED: Fix escpaing of % character in LaTeX code spans and blocks</li>
+<li>FIXED: Fix html comments inside code blocks (fixes #118)</li>
+<li>FIXED: Fix issue where <code>~</code> is mistakenly interpreted as fence delimiter</li>
+<li>FIXED: Fix issue with BOM and files > 4k</li>
+<li>FIXED: Fix issue with dollar math delimiters inside code (fixes #134)</li>
+<li>FIXED: Fix token length in OPML</li>
+<li>FIXED: Improve OPML export; add OPML tests</li>
+<li>FIXED: Normalize line spacing in CriticMarkup notes in LaTeX (fixes #120)</li>
+<li>FIXED: Preserve tabs following leading hashes in code blocks</li>
+<li>FIXED: Prevent potential null dereference</li>
+<li>FIXED: Remove lock file</li>
+<li>FIXED: Trim single remaining whitespace when exporting headers</li>
+<li>FIXED: Trim trailing newlines in definition blocks</li>
+<li>FIXED: Use Setext headers when necessary to convert from OPML to text (fixes #138)</li>
+<li>FIXED: Use \ul instead of \underline when soul package is in use (fixes #121)</li>
+<li>Merge pull request #132 from jlargentaye/develop</li>
+<li>UPDATE: Clarify DevelopmentNotes re: libcurl</li>
+<li>UPDATE: Clarify README re: libcurl</li>
+<li>UPDATED: ‘\item{}’ no longer needed since square brackets escaped on their own</li>
+<li>UPDATED: Add 6.3.1 release notes</li>
+<li>UPDATED: Add allowfullscreen to list of boolean HTML attributes</li>
+<li>UPDATED: Add more BibTeX test cases</li>
+<li>UPDATED: Adjust metadata for test files</li>
+<li>UPDATED: Allow '' to preserve line break in metadata. (Addresses #86)</li>
+<li>UPDATED: Apply astyle</li>
+<li>UPDATED: Fix whitespace with boolean HTML attributes</li>
+<li>UPDATED: Ignore escaped space at end of code span</li>
+<li>UPDATED: Test % escaping in URLs</li>
+</ul></li>
<li><p>2018–03–28 - v 6.3.2:</p>
<ul>
Title: MultiMarkdown v6 Development Notes
Author: Fletcher T. Penney
-Date: 2018-03-38
+Date: 2018-09-01
LaTeX Config: tufte-handout
Base Header Level: 3
uuid: dd2d8e76-dc2d-416d-9acd-5395d20871c2
# Changelog #
+* 2018-09-01 - v 6.4.0:
+
+ * ADDED: Add ODF Header metadata and fix issue with LaTeX Header metadata
+ * ADDED: Add additional tests for special characters
+ * ADDED: Add initial OPML export support (address #9)
+ * ADDED: Add opml option to read for MultiMarkdown OPML files
+ * Add missing Latex support files
+ * Avoid potential error with stack_free
+ * CHANGED: Remove unnecessary code
+ * FIXED: Allow caption without trailing newline at end of document
+ * FIXED: Escape square brackets, e.g. '{[foo]}' (addresses #128 and #129)
+ * FIXED: Fix escpaing of % character in LaTeX code spans and blocks
+ * FIXED: Fix html comments inside code blocks (fixes #118)
+ * FIXED: Fix issue where `~` is mistakenly interpreted as fence delimiter
+ * FIXED: Fix issue with BOM and files > 4k
+ * FIXED: Fix issue with dollar math delimiters inside code (fixes #134)
+ * FIXED: Fix token length in OPML
+ * FIXED: Improve OPML export; add OPML tests
+ * FIXED: Normalize line spacing in CriticMarkup notes in LaTeX (fixes #120)
+ * FIXED: Preserve tabs following leading hashes in code blocks
+ * FIXED: Prevent potential null dereference
+ * FIXED: Remove lock file
+ * FIXED: Trim single remaining whitespace when exporting headers
+ * FIXED: Trim trailing newlines in definition blocks
+ * FIXED: Use Setext headers when necessary to convert from OPML to text (fixes #138)
+ * FIXED: Use \ul instead of \underline when soul package is in use (fixes #121)
+ * Merge pull request #132 from jlargentaye/develop
+ * UPDATE: Clarify DevelopmentNotes re: libcurl
+ * UPDATE: Clarify README re: libcurl
+ * UPDATED: '\item{}' no longer needed since square brackets escaped on their own
+ * UPDATED: Add 6.3.1 release notes
+ * UPDATED: Add allowfullscreen to list of boolean HTML attributes
+ * UPDATED: Add more BibTeX test cases
+ * UPDATED: Adjust metadata for test files
+ * UPDATED: Allow '\' to preserve line break in metadata. (Addresses #86)
+ * UPDATED: Apply astyle
+ * UPDATED: Fix whitespace with boolean HTML attributes
+ * UPDATED: Ignore escaped space at end of code span
+ * UPDATED: Test % escaping in URLs
+
+
* 2018-03-28 - v 6.3.2:
* UPDATED: Update documentation
<office:meta>
<dc:title>MultiMarkdown v6 Quick Start Guide</dc:title>
<dc:creator>Fletcher T. Penney</dc:creator>
- <meta:user-defined meta:name="version">6.3.2</meta:user-defined>
+ <meta:user-defined meta:name="version">6.4.0</meta:user-defined>
<meta:user-defined meta:name="uuid">0d6313fa-9135-477e-9c14-7d62c1977833</meta:user-defined>
</office:meta>
<office:body>
</text:table-of-content>
-<text:h text:outline-level="3"><text:bookmark text:name="introduction"/>Introduction </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="introduction"/>Introduction</text:h>
-<text:p text:style-name="Standard">Version: 6.3.2</text:p>
+<text:p text:style-name="Standard">Version: 6.4.0</text:p>
<text:p text:style-name="Standard">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.</text:p>
-<text:h text:outline-level="3"><text:bookmark text:name="performance"/>Performance </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="performance"/>Performance</text:h>
<text:p text:style-name="Standard">A big motivating factor leading to the development of MMD v6 was
performance. When MMD first migrated from Perl to C (based on <text:a xlink:type="simple" xlink:href="https://github.com/jgm/peg-markdown">peg-
the increased legibility of the source code of MMD (in my biased opinion
anyway) make this project worthwhile.</text:p>
-<text:h text:outline-level="3"><text:bookmark text:name="parsetree"/>Parse Tree </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="parsetree"/>Parse Tree</text:h>
<text:p text:style-name="Standard">MMD v6 performs its parsing in the following steps:</text:p>
slightly more abstracted <text:span text:style-name="Source_20_Text">mmd_convert_string()</text:span> function that handles creating
and destroying the <text:span text:style-name="Source_20_Text">mmd_engine</text:span> automatically.</text:p>
-<text:h text:outline-level="3"><text:bookmark text:name="features"/>Features </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="features"/>Features</text:h>
-<text:h text:outline-level="4"><text:bookmark text:name="abbreviationsoracronyms"/>Abbreviations (Or Acronyms) </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="abbreviationsoracronyms"/>Abbreviations (Or Acronyms)</text:h>
<text:p text:style-name="Standard">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
includes letters, numbers, periods, and hyphens, but not much else. For more
complex abbreviations, you must explicitly mark uses of the abbreviation.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="citations"/>Citations </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="citations"/>Citations</text:h>
<text:p text:style-name="Standard">Citations can be specified using an inline syntax, just like inline footnotes.
If you wish to use BibTeX, then configure the <text:span text:style-name="Source_20_Text">bibtex</text:span> metadata (required) and
<text:p text:style-name="Standard">The HTML output for citations now uses parentheses instead of brackets, e.g.
<text:span text:style-name="Source_20_Text">(1)</text:span> instead of <text:span text:style-name="Source_20_Text">[1]</text:span>.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="criticmarkup"/>CriticMarkup </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="criticmarkup"/>CriticMarkup</text:h>
<text:p text:style-name="Standard">MMD v6 has improved support for <text:a xlink:type="simple" xlink:href="http://criticmarkup.com/">CriticMarkup</text:a>, both in terms of parsing, and
in terms of support for each output format. You can <text:span text:style-name="Underline">insert text</text:span>,
<text:p text:style-name="Standard">T
formats).</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="embeddedimages"/>Embedded Images </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="embeddedimages"/>Embedded Images</text:h>
<text:p text:style-name="Standard">Supported export formats (<text:span text:style-name="Source_20_Text">odt</text:span>, <text:span text:style-name="Source_20_Text">epub</text:span>, <text:span text:style-name="Source_20_Text">bundle</text:span>, <text:span text:style-name="Source_20_Text">bundlezip</text:span>) include
images inside the export document:</text:p>
<text:p text:style-name="Standard">ed
as such. I working on options for this for the future.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="emphandstrong"/>Emph and Strong </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="emphandstrong"/>Emph and Strong</text:h>
<text:p text:style-name="Standard">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.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="epub3support"/>EPUB 3 Support </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="epub3support"/>EPUB 3 Support</text:h>
<text:p text:style-name="Standard">MMD v6 now provides support for direct creation of <text:a xlink:type="simple" xlink:href="https://en.wikipedia.org/wiki/EPUB">EPUB 3</text:a> files. Previously
a separate tool was required to create EPUB files from MMD. It’s now built-
run in batch mode (using the <text:span text:style-name="Source_20_Text">-b\--batch</text:span> options). Otherwise, it simply
outputs the HTML 5 file that would serve as the primary content for the EPUB.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="fencedcodeblocks"/>Fenced Code Blocks </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="fencedcodeblocks"/>Fenced Code Blocks</text:h>
<text:p text:style-name="Standard">Fenced code blocks are fundamentally the same as MMD v5, except:</text:p>
</text:list>
-<text:h text:outline-level="4"><text:bookmark text:name="footnotes"/>Footnotes </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="footnotes"/>Footnotes</text:h>
<text:p text:style-name="Standard">The HTML output for footnotes now uses superscripts instead of brackets, e.g.
<text:span text:style-name="Source_20_Text"><sup>1</sup></text:span> instead of <text:span text:style-name="Source_20_Text">[1]</text:span>.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="glossaryterms"/>Glossary Terms </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="glossaryterms"/>Glossary Terms</text:h>
<text:p text:style-name="Standard">If there are terms in your document you wish to define in a glossary<text:note text:id="gn3" text:note-class="glossary"><text:note-body><text:p text:style-name="Footnote">The
glossary collects information about important terms used in your document</text:p></text:note-body></text:note> at
letters, numbers, periods, and hyphens, but not much else. For more complex
glossary terms, you must explicitly mark uses of the term.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="htmlcomments"/>HTML Comments </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="htmlcomments"/>HTML Comments</text:h>
<text:p text:style-name="Standard">Previously, HTML Comments were used by MultiMarkdown to include raw text for
inclusion in the output file. This was useful, but limited, as it could only
<text:p text:style-name="Standard">Take a look at the <text:span text:style-name="Source_20_Text">HTML Comments.text</text:span> file in the test suite for a better
understanding of comment blocks vs comment spans, and how they are parsed.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="internationalization"/>Internationalization </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="internationalization"/>Internationalization</text:h>
<text:p text:style-name="Standard">MMD v6 includes support for substituting certain text phrases in other
languages. This only affects the HTML format.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="latexchanges"/>LaTeX Changes </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="latexchanges"/>LaTeX Changes</text:h>
<text:p text:style-name="Standard">LaTeX support is slightly different than in prior versions of MMD. It is
designed to be a bit more consistent, and easier for basic use.</text:p>
location for your system. I would like to make this easier, but haven’t found
the best configuration yet.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="metadata"/>Metadata </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="metadata"/>Metadata</text:h>
<text:p text:style-name="Standard">Metadata in MMD v6 includes new support for LaTeX – the <text:span text:style-name="Source_20_Text">latex config</text:span> key
allows you to automatically setup of multiple <text:span text:style-name="Source_20_Text">latex include</text:span> files at once.
<text:p text:style-name="Preformatted Text">Title:<text:tab/>Some Title<text:line-break/>MMD Header:<text:tab/>This is *MMD* text.<text:line-break/>MMD Footer:<text:tab/>{{footer.txt}}<text:line-break/></text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="outputformats"/>Output Formats </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="outputformats"/>Output Formats</text:h>
<text:p text:style-name="Standard">MultiMarkdown 6 supports the following output formats, using the <text:span text:style-name="Source_20_Text">-t</text:span>
command-line argument:</text:p>
</text:list>
-<text:h text:outline-level="4"><text:bookmark text:name="rawsource"/>Raw Source </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="rawsource"/>Raw Source</text:h>
-<text:p text:style-name="Standard">In older versions of MultiMarkdown you could use an HTML comment to pass raw LaTeX or other content to the final document. This worked reasonably well, but was limited and didn’t work well when exporting to multiple formats. It was time for something new.</text:p>
+<text:p text:style-name="Standard">In older versions of MultiMarkdown you could use an HTML comment to pass raw
+LaTeX or other content to the final document. This worked reasonably well,
+but was limited and didn’t work well when exporting to multiple formats. It
+was time for something new.</text:p>
-<text:p text:style-name="Standard">MMD v6 offers a new feature to handle this. Code spans and code blocks can be flagged as representing raw source:</text:p>
+<text:p text:style-name="Standard">MMD v6 offers a new feature to handle this. Code spans and code blocks can
+be flagged as representing raw source:</text:p>
<text:p text:style-name="Preformatted Text">foo `*bar*`{=html}<text:line-break/><text:line-break/>```{=latex}<text:line-break/>*foo*<text:line-break/>```<text:line-break/></text:p>
</text:list>
-<text:h text:outline-level="4"><text:bookmark text:name="tableofcontents"/>Table of Contents </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="tableofcontents"/>Table of Contents</text:h>
<text:p text:style-name="Standard">By placing <text:span text:style-name="Source_20_Text">{{TOC}}</text:span> 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.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="tables"/>Tables </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="tables"/>Tables</text:h>
<text:p text:style-name="Standard">Tables in MultiMarkdown-6 work basically the same as before, but a caption, if
present, must come <text:span text:style-name="MMD-Italic">after</text:span> the body of the table, not <text:span text:style-name="MMD-Italic">before</text:span>.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="transclusion"/>Transclusion </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="transclusion"/>Transclusion</text:h>
<text:p text:style-name="Standard">File transclusion works basically the same way – <text:span text:style-name="Source_20_Text">{{file}}</text:span> is used to
indicate a file that needs to be transcluded. <text:span text:style-name="Source_20_Text">{{file.*}}</text:span> allows for
This can be useful when a particular file can either be a standalone document,
or a chapter inside a larger document.</text:p>
-<text:h text:outline-level="3"><text:bookmark text:name="developernotes"/>Developer Notes </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="developernotes"/>Developer Notes</text:h>
<text:p text:style-name="Standard">If you’re using MMD as a library in another application, there are a few
things to be aware of.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="objectpools"/>Object Pools </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="objectpools"/>Object Pools</text:h>
<text:p text:style-name="Standard">To improve performance, MMD has the option to allocate the memory for the
tokens used in parsing in large chunks (“object pools”). Allocating a single
properly manage the object pool can lead to massive memory leaks, freeing
memory before that is still in use, or other potential problems.</text:p>
-<text:h text:outline-level="4"><text:bookmark text:name="htmlbooleanattributes"/>HTML Boolean Attributes </text:h>
+<text:h text:outline-level="4"><text:bookmark text:name="htmlbooleanattributes"/>HTML Boolean Attributes</text:h>
<text:p text:style-name="Standard">Most HTML attributes are of the key-value type (e.g. <text:span text:style-name="Source_20_Text">key="value"</text:span>). But some
less frequently used attributes are boolean attributes (e.g. <text:span text:style-name="Source_20_Text"><video<text:line-break/>controls></text:span>). Properly distinguishing HTML from other uses of the <text:span text:style-name="Source_20_Text"><</text:span>
</text:list>
-<text:h text:outline-level="3"><text:bookmark text:name="futuresteps"/>Future Steps </text:h>
+<text:h text:outline-level="3"><text:bookmark text:name="futuresteps"/>Future Steps</text:h>
<text:p text:style-name="Standard">Some features I plan to implement at some point:</text:p>
<meta charset="utf-8"/>
<title>MultiMarkdown v6 Quick Start Guide</title>
<meta name="author" content="Fletcher T. Penney"/>
- <meta name="version" content="6.3.2"/>
+ <meta name="version" content="6.4.0"/>
<meta name="uuid" content="0d6313fa-9135-477e-9c14-7d62c1977833"/>
</head>
<body>
</ul>
</div>
-<h3 id="introduction">Introduction </h3>
+<h3 id="introduction">Introduction</h3>
-<p>Version: 6.3.2</p>
+<p>Version: 6.4.0</p>
<p>This document serves as a description of MultiMarkdown (<abbr title="MultiMarkdown">MMD</abbr>) v6, as well as a sample
document to demonstrate the various features. Specifically, differences from
<abbr title="MultiMarkdown">MMD</abbr> v5 will be pointed out.</p>
-<h3 id="performance">Performance </h3>
+<h3 id="performance">Performance</h3>
<p>A big motivating factor leading to the development of <abbr title="MultiMarkdown">MMD</abbr> v6 was
performance. When <abbr title="MultiMarkdown">MMD</abbr> first migrated from Perl to C (based on <a href="https://github.com/jgm/peg-markdown">peg-
the increased legibility of the source code of <abbr title="MultiMarkdown">MMD</abbr> (in my biased opinion
anyway) make this project worthwhile.</p>
-<h3 id="parsetree">Parse Tree </h3>
+<h3 id="parsetree">Parse Tree</h3>
<p><abbr title="MultiMarkdown">MMD</abbr> v6 performs its parsing in the following steps:</p>
slightly more abstracted <code>mmd_convert_string()</code> function that handles creating
and destroying the <code>mmd_engine</code> automatically.</p>
-<h3 id="features">Features </h3>
+<h3 id="features">Features</h3>
-<h4 id="abbreviationsoracronyms">Abbreviations (Or Acronyms) </h4>
+<h4 id="abbreviationsoracronyms">Abbreviations (Or Acronyms)</h4>
<p>This file includes the use of <abbr title="MultiMarkdown">MMD</abbr> as an abbreviation for MultiMarkdown. The
abbreviation will be expanded on the first use, and the shortened form will be
includes letters, numbers, periods, and hyphens, but not much else. For more
complex abbreviations, you must explicitly mark uses of the abbreviation.</p>
-<h4 id="citations">Citations </h4>
+<h4 id="citations">Citations</h4>
<p>Citations can be specified using an inline syntax, just like inline footnotes.
If you wish to use BibTeX, then configure the <code>bibtex</code> metadata (required) and
<p>The HTML output for citations now uses parentheses instead of brackets, e.g.
<code>(1)</code> instead of <code>[1]</code>.</p>
-<h4 id="criticmarkup">CriticMarkup </h4>
+<h4 id="criticmarkup">CriticMarkup</h4>
<p><abbr title="MultiMarkdown">MMD</abbr> v6 has improved support for <a href="http://criticmarkup.com/">CriticMarkup</a>, both in terms of parsing, and
in terms of support for each output format. You can <ins>insert text</ins>,
<p>T
formats).</p>
-<h4 id="embeddedimages">Embedded Images </h4>
+<h4 id="embeddedimages">Embedded Images</h4>
<p>Supported export formats (<code>odt</code>, <code>epub</code>, <code>bundle</code>, <code>bundlezip</code>) include
images inside the export document:</p>
<p>ed
as such. I working on options for this for the future.</p>
-<h4 id="emphandstrong">Emph and Strong </h4>
+<h4 id="emphandstrong">Emph and Strong</h4>
<p>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.</p>
-<h4 id="epub3support">EPUB 3 Support </h4>
+<h4 id="epub3support">EPUB 3 Support</h4>
<p><abbr title="MultiMarkdown">MMD</abbr> v6 now provides support for direct creation of <a href="https://en.wikipedia.org/wiki/EPUB">EPUB 3</a> files. Previously
a separate tool was required to create EPUB files from <abbr title="MultiMarkdown">MMD</abbr>. It’s now built-
run in batch mode (using the <code>-b\--batch</code> options). Otherwise, it simply
outputs the HTML 5 file that would serve as the primary content for the EPUB.</p>
-<h4 id="fencedcodeblocks">Fenced Code Blocks </h4>
+<h4 id="fencedcodeblocks">Fenced Code Blocks</h4>
<p>Fenced code blocks are fundamentally the same as <abbr title="MultiMarkdown">MMD</abbr> v5, except:</p>
considered to be part of the code block.</p></li>
</ol>
-<h4 id="footnotes">Footnotes </h4>
+<h4 id="footnotes">Footnotes</h4>
<p>The HTML output for footnotes now uses superscripts instead of brackets, e.g.
<code><sup>1</sup></code> instead of <code>[1]</code>.</p>
-<h4 id="glossaryterms">Glossary Terms </h4>
+<h4 id="glossaryterms">Glossary Terms</h4>
<p>If there are terms in your document you wish to define in a <a href="#gn:3" id="gnref:3" title="see glossary" class="glossary">glossary</a> at
the end of your document, you can define them using the glossary syntax.</p>
letters, numbers, periods, and hyphens, but not much else. For more complex
glossary terms, you must explicitly mark uses of the term.</p>
-<h4 id="htmlcomments">HTML Comments </h4>
+<h4 id="htmlcomments">HTML Comments</h4>
<p>Previously, HTML Comments were used by MultiMarkdown to include raw text for
inclusion in the output file. This was useful, but limited, as it could only
<p>Take a look at the <code>HTML Comments.text</code> file in the test suite for a better
understanding of comment blocks vs comment spans, and how they are parsed.</p>
-<h4 id="internationalization">Internationalization </h4>
+<h4 id="internationalization">Internationalization</h4>
<p><abbr title="MultiMarkdown">MMD</abbr> v6 includes support for substituting certain text phrases in other
languages. This only affects the HTML format.</p>
-<h4 id="latexchanges">LaTeX Changes </h4>
+<h4 id="latexchanges">LaTeX Changes</h4>
<p>LaTeX support is slightly different than in prior versions of <abbr title="MultiMarkdown">MMD</abbr>. It is
designed to be a bit more consistent, and easier for basic use.</p>
location for your system. I would like to make this easier, but haven’t found
the best configuration yet.</p>
-<h4 id="metadata">Metadata </h4>
+<h4 id="metadata">Metadata</h4>
<p>Metadata in <abbr title="MultiMarkdown">MMD</abbr> v6 includes new support for LaTeX – the <code>latex config</code> key
allows you to automatically setup of multiple <code>latex include</code> files at once.
MMD Footer: {{footer.txt}}
</code></pre>
-<h4 id="outputformats">Output Formats </h4>
+<h4 id="outputformats">Output Formats</h4>
<p>MultiMarkdown 6 supports the following output formats, using the <code>-t</code>
command-line argument:</p>
package is compressed to a single zip file (similar to EPUB and ODor macOS builds.</li>
</ul>
-<h4 id="rawsource">Raw Source </h4>
+<h4 id="rawsource">Raw Source</h4>
-<p>In older versions of MultiMarkdown you could use an HTML comment to pass raw LaTeX or other content to the final document. This worked reasonably well, but was limited and didn’t work well when exporting to multiple formats. It was time for something new.</p>
+<p>In older versions of MultiMarkdown you could use an HTML comment to pass raw
+LaTeX or other content to the final document. This worked reasonably well,
+but was limited and didn’t work well when exporting to multiple formats. It
+was time for something new.</p>
-<p><abbr title="MultiMarkdown">MMD</abbr> v6 offers a new feature to handle this. Code spans and code blocks can be flagged as representing raw source:</p>
+<p><abbr title="MultiMarkdown">MMD</abbr> v6 offers a new feature to handle this. Code spans and code blocks can
+be flagged as representing raw source:</p>
<pre><code>foo `*bar*`{=html}
<li><code>*</code> – wildcard matches any output format</li>
</ul>
-<h4 id="tableofcontents">Table of Contents </h4>
+<h4 id="tableofcontents">Table of Contents</h4>
<p>By placing <code>{{TOC}}</code> in your document, you can insert an automatically
generated Table of Contents in your document. As of <abbr title="MultiMarkdown">MMD</abbr> v6, the native
Table of Contents functionality is used when exporting to LaTeX or
OpenDocument formats.</p>
-<h4 id="tables">Tables </h4>
+<h4 id="tables">Tables</h4>
<p>Tables in MultiMarkdown-6 work basically the same as before, but a caption, if
present, must come <em>after</em> the body of the table, not <em>before</em>.</p>
-<h4 id="transclusion">Transclusion </h4>
+<h4 id="transclusion">Transclusion</h4>
<p>File transclusion works basically the same way – <code>{{file}}</code> is used to
indicate a file that needs to be transcluded. <code>{{file.*}}</code> allows for
This can be useful when a particular file can either be a standalone document,
or a chapter inside a larger document.</p>
-<h3 id="developernotes">Developer Notes </h3>
+<h3 id="developernotes">Developer Notes</h3>
<p>If you’re using <abbr title="MultiMarkdown">MMD</abbr> as a library in another application, there are a few
things to be aware of.</p>
-<h4 id="objectpools">Object Pools </h4>
+<h4 id="objectpools">Object Pools</h4>
<p>To improve performance, <abbr title="MultiMarkdown">MMD</abbr> has the option to allocate the memory for the
tokens used in parsing in large chunks (“object pools”). Allocating a single
properly manage the object pool can lead to massive memory leaks, freeing
memory before that is still in use, or other potential problems.</p>
-<h4 id="htmlbooleanattributes">HTML Boolean Attributes </h4>
+<h4 id="htmlbooleanattributes">HTML Boolean Attributes</h4>
<p>Most HTML attributes are of the key-value type (e.g. <code>key="value"</code>). But some
less frequently used attributes are boolean attributes (e.g. <code><video
off. I will continue to research additional options.</p></li>
</ul>
-<h3 id="futuresteps">Future Steps </h3>
+<h3 id="futuresteps">Future Steps</h3>
<p>Some features I plan to implement at some point:</p>
Title: MultiMarkdown v6 Quick Start Guide
Author: Fletcher T. Penney
-Version: 6.3.2
+Version: 6.4.0
LaTeX Config: tufte-handout
Base Header Level: 3
uuid: 0d6313fa-9135-477e-9c14-7d62c1977833
## Raw Source ##
-In older versions of MultiMarkdown you could use an HTML comment to pass raw LaTeX or other content to the final document. This worked reasonably well, but was limited and didn't work well when exporting to multiple formats. It was time for something new.
+In older versions of MultiMarkdown you could use an HTML comment to pass raw
+LaTeX or other content to the final document. This worked reasonably well,
+but was limited and didn't work well when exporting to multiple formats. It
+was time for something new.
-MMD v6 offers a new feature to handle this. Code spans and code blocks can be flagged as representing raw source:
+MMD v6 offers a new feature to handle this. Code spans and code blocks can
+be flagged as representing raw source:
foo `*bar*`{=html}
| ---------- | ------------------------- |
| Title: | MultiMarkdown |
| Author: | Fletcher T. Penney |
-| Date: | 2018-03-28 |
+| Date: | 2018-09-01 |
| Copyright: | Copyright © 2016 - 2018 Fletcher T. Penney. |
-| Version: | 6.3.2 |
+| Version: | 6.4.0 |
master branch: [](https://travis-ci.org/fletcher/MultiMarkdown-6)
develop branch: [](https://travis-ci.org/fletcher/MultiMarkdown-6)