{
  "file": "lib/parse-markdown.js",
  "content": "<pre class=\"language-javascript line-numbers\"><code class=\"language-javascript}\"><span aria-hidden=\"true\" role=\"presentation\" class=\"line-numbers-rows\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span><span class=\"token string\">'use strict'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> Prism <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'prismjs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\" spellcheck=\"true\">// Prism will attach required modules through some globals majic spells</span>\n<span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'prismjs/components/prism-handlebars'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'prismjs/components/prism-markdown'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'prismjs/components/prism-bash'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'prismjs/components/prism-diff'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'prismjs/components/prism-json'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'prismjs/components/prism-scss'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">var</span> stripDataTags <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./strip-data-tag'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\" spellcheck=\"true\">/**\n * Handle parsing markdown using [Prism](http://prismjs.com/)\n * @class parseMarkdown\n * @constructor\n * @param {string} description Markdown string to parse\n * @return {string} HTML string parsed from passed markdown\n */</span>\n\n<span class=\"token keyword\">const</span> md <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'markdown-it'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  html<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span> <span class=\"token comment\" spellcheck=\"true\">// Allow html tags</span>\n  linkify<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  typographer<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">highlight</span><span class=\"token punctuation\">(</span>str<span class=\"token punctuation\">,</span> lang<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\" spellcheck=\"true\">// We support flagging code blocks with `glimmer` or `htmlbars`, but Prism</span>\n    <span class=\"token comment\" spellcheck=\"true\">// only recognizes 'handlebars'</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>lang <span class=\"token operator\">===</span> <span class=\"token string\">'glimmer'</span> <span class=\"token operator\">||</span> lang <span class=\"token operator\">===</span> <span class=\"token string\">'htmlbars'</span> <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> lang <span class=\"token operator\">=</span> <span class=\"token string\">'handlebars'</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">let</span> stripped <span class=\"token operator\">=</span> <span class=\"token function\">stripDataTags</span><span class=\"token punctuation\">(</span>str<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>lang <span class=\"token operator\">&amp;&amp;</span> Prism<span class=\"token punctuation\">.</span>languages<span class=\"token punctuation\">[</span>lang<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token template-string\"><span class=\"token string\">`&lt;pre class=\\\"language-</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>lang<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\\\">&lt;code class=\\\"language-</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>lang<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\\\">`</span></span> <span class=\"token operator\">+</span>\n          Prism<span class=\"token punctuation\">.</span><span class=\"token function\">highlight</span><span class=\"token punctuation\">(</span>stripped<span class=\"token punctuation\">,</span> Prism<span class=\"token punctuation\">.</span>languages<span class=\"token punctuation\">.</span>javascript<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span>\n          <span class=\"token string\">'&lt;/code>&lt;/pre>'</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span><span class=\"token punctuation\">(</span>ex<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">warn</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Failed parsing language: '</span><span class=\"token punctuation\">,</span> ex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string\">''</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token string\">''</span><span class=\"token punctuation\">;</span> <span class=\"token comment\" spellcheck=\"true\">// use external default escaping</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\" spellcheck=\"true\">// Custom Render Methods</span>\n<span class=\"token comment\" spellcheck=\"true\">// ---------------------------------------------------------------------------</span>\n<span class=\"token comment\" spellcheck=\"true\">/**\n * NEW render rule `heading_open` is called for any header element's opening token.\n * For all header opening tags, return an opening glimmer block for a\n * {{c-l class='FountainheadHeader'}} component.\n *\n * Header elements follow the token pattern:&lt;br/>\n * `heading_open => inline => heading_close`\n *\n * Using this pattern, we also get the content from the next token to create the\n * anchor id hash fragment for the link header.\n * @method heading_open\n * @param {Array} tokens\n * @param {number} index\n * @return {string} Opening glimmer block string for a\n *                  {{c-l class='FountainheadHeader'}} with tag type and href id.\n */</span>\nmd<span class=\"token punctuation\">.</span>renderer<span class=\"token punctuation\">.</span>rules<span class=\"token punctuation\">.</span>heading_open <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>tokens<span class=\"token punctuation\">,</span> index<span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> header <span class=\"token operator\">=</span> tokens<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">let</span> text <span class=\"token operator\">=</span> tokens<span class=\"token punctuation\">[</span>index <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">let</span> href <span class=\"token operator\">=</span> <span class=\"token string\">''</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>text <span class=\"token operator\">&amp;&amp;</span> text<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    href <span class=\"token operator\">=</span> text<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">.</span><span class=\"token function\">toLowerCase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\s/g</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'-'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token template-string\"><span class=\"token string\">`{{#fountainhead-header tagName=\"</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>header<span class=\"token punctuation\">.</span>tag<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\" elementId=\"</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>href<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\"}}`</span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\" spellcheck=\"true\">/**\n * NEW render rule `heading_close` called for any header closing token. Replace HTML\n * closing tag with a closing {{c-l class='FountainheadHeader'}} glimmer block to\n * close opening glimmer block.\n * @method heading_close\n * @return {string}\n */</span>\nmd<span class=\"token punctuation\">.</span>renderer<span class=\"token punctuation\">.</span>rules<span class=\"token punctuation\">.</span>heading_close <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">'{{/fountainhead-header}}\\n'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\" spellcheck=\"true\">/**\n * Scans the description text for instances of markdown code blocks flagged\n * as `\"glimmer\"` syntax. If any such instances are found, they are copied,\n * stripped of their triple backticks and re-inserted into the\n * `templateString` immediately after the original declaration. This allows\n * for functional copies of your code examples to be automatically rendered\n * into the description, without having to duplicate the code block itself.\n *\n * If your functional code needs to have different setup to work correctly in\n * the Fountainhead context (for example, if you need to use `core-state` to\n * set up sandboxed state and controls), simply use `\"handlebars\"` or no\n * syntax flag, and manually add the code block you want Fountainhead to\n * render after your example. Neato!\n *\n * @method _renderCodeBlocks\n * @param {String} description The description text to scan for code blocks\n * @return {String}\n */</span>\n<span class=\"token keyword\">const</span> renderCodeBlocks <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>description<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\" spellcheck=\"true\">// Look for triple backtick code blocks flagged as `glimmer`;</span>\n  <span class=\"token comment\" spellcheck=\"true\">// define end of block as triple backticks followed by a newline</span>\n  <span class=\"token keyword\">let</span> matches <span class=\"token operator\">=</span> description<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/(```glimmer)(.|\\n)*?```/gi</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>matches <span class=\"token operator\">&amp;&amp;</span> matches<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    matches<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>codeBlock <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">let</span> blockEnd <span class=\"token operator\">=</span> codeBlock<span class=\"token punctuation\">.</span>length <span class=\"token operator\">+</span> description<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span>codeBlock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">let</span> plainCode <span class=\"token operator\">=</span> codeBlock<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/(```glimmer|```)/gi</span><span class=\"token punctuation\">,</span> <span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      description <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>description<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>blockEnd<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>plainCode<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span> description<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span>blockEnd<span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> description<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\" spellcheck=\"true\">// Export parse function</span>\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token function\">parseMarkdown</span><span class=\"token punctuation\">(</span>description<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Check for glimmer code blocks and make them REAL BOYS AND GIRLS</span>\n  description <span class=\"token operator\">=</span> <span class=\"token function\">renderCodeBlocks</span><span class=\"token punctuation\">(</span>description<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Parse description markdown</span>\n  description <span class=\"token operator\">=</span> md<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span>description<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Check for codeblocks, we need to escape double curlies b/c these are code examples</span>\n  <span class=\"token keyword\">let</span> codeBlocks <span class=\"token operator\">=</span> description<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/&lt;code([\\s\\S]*?)&lt;\\/code/g</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>codeBlocks<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\" spellcheck=\"true\">// If there are code blocks in this description, sanitize them for templates</span>\n    codeBlocks<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>codeBlock<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>codeBlock<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span><span class=\"token string\">'{{'</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span> <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span> <span class=\"token comment\" spellcheck=\"true\">// If there's not a double curly do less</span>\n\n      <span class=\"token keyword\">var</span> sanitizedBlock <span class=\"token operator\">=</span> codeBlock<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/{{/g</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'\\\\{{'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\" spellcheck=\"true\">// Prep sanitized block version</span>\n      <span class=\"token comment\" spellcheck=\"true\">// Replace block in description w/ sanitized version</span>\n      description <span class=\"token operator\">=</span> description<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span>codeBlock<span class=\"token punctuation\">,</span> sanitizedBlock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Markdown-it replaces single and double quotes with fancy characters which</span>\n  <span class=\"token comment\" spellcheck=\"true\">// break the runtime template compiler. Handle sanitizing them here.</span>\n  description <span class=\"token operator\">=</span> description<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/[“”]/g</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'\\\"'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\" spellcheck=\"true\">// Double quotes</span>\n  description <span class=\"token operator\">=</span> description<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/&amp;quot;|‘|’/g</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'\\''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\" spellcheck=\"true\">// Single quotes</span>\n\n  <span class=\"token keyword\">return</span> description<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n</code></pre>"
}