diff --git a/src/peghighlighterresult.cpp b/src/peghighlighterresult.cpp index b22ebda5..1419f74a 100644 --- a/src/peghighlighterresult.cpp +++ b/src/peghighlighterresult.cpp @@ -52,7 +52,7 @@ PegHighlighterResult::PegHighlighterResult(const PegMarkdownHighlighter *p_peg, parseHRuleBlocks(p_peg, p_result); - parseTableBlocks(p_peg, p_result); + parseTableBlocks(p_result); } static bool compHLUnit(const HLUnit &p_a, const HLUnit &p_b) @@ -272,8 +272,7 @@ void PegHighlighterResult::parseFencedCodeBlocks(const PegMarkdownHighlighter *p } } -void PegHighlighterResult::parseTableBlocks(const PegMarkdownHighlighter *p_peg, - const QSharedPointer &p_result) +void PegHighlighterResult::parseTableBlocks(const QSharedPointer &p_result) { const QVector &tableRegs = p_result->m_tableRegions; const QVector &headerRegs = p_result->m_tableHeaderRegions; diff --git a/src/peghighlighterresult.h b/src/peghighlighterresult.h index 939c947e..5e6f84e3 100644 --- a/src/peghighlighterresult.h +++ b/src/peghighlighterresult.h @@ -113,8 +113,7 @@ private: const QSharedPointer &p_result); // Parse table blocks from parse results. - void parseTableBlocks(const PegMarkdownHighlighter *p_peg, - const QSharedPointer &p_result); + void parseTableBlocks(const QSharedPointer &p_result); #if 0 void parseBlocksElementRegionOne(QHash> &p_regs, diff --git a/src/resources/docs/markdown_guide_en.md b/src/resources/docs/markdown_guide_en.md index 612d3231..c831d574 100644 --- a/src/resources/docs/markdown_guide_en.md +++ b/src/resources/docs/markdown_guide_en.md @@ -122,9 +122,15 @@ As VNote suggests: ### Diagrams -> You need to enable Flowchart.js or Mermaid in the `Markdown` menu. +> You need to enable Flowchart.js or Mermaid or WaveDrom in the `Markdown` menu and restart current opened tabs. -VNote supports [Flowchart.js](http://flowchart.js.org/) and [Mermaid](https://mermaidjs.github.io/) to draw diagrams such as *flowchart* and *sequence diagram*. You should use `flow` or `flowchart` and `mermaid` specified as the language of the fenced code block and write the definition of your diagram within it. +VNote supports the following engines to draw diagrams. You should specify particular language of the fenced code block and write the definition of your diagram within it. + +- [Flowchart.js](http://flowchart.js.org/) for *flowchart* with language `flow` or `flowchart`; +- [Mermaid](https://mermaidjs.github.io/) with language `mermaid`; +- [WaveDrom](https://wavedrom.com/) for *digital timing diagram* with language `wavedrom`; + +For example, ```flowchart st=>start: Start:>http://www.google.com[blank] diff --git a/src/resources/docs/markdown_guide_zh.md b/src/resources/docs/markdown_guide_zh.md index 95d362d6..0204c014 100644 --- a/src/resources/docs/markdown_guide_zh.md +++ b/src/resources/docs/markdown_guide_zh.md @@ -123,9 +123,15 @@ As VNote suggests: ### 图表 -> 需要在`Markdown`菜单中启用Flowchart.js或Mermaid。 +> 需要在`Markdown`菜单中启用Flowchart.js或Mermaid或WaveDrom,并重新打开当前标签页。 -VNote支持 [Flowchart.js](http://flowchart.js.org/) 和 [Mermaid](https://mermaidjs.github.io/) 来实现诸如*流程图*和*序列图*等图表。您需要使用代码块,并标明语言为`flow`或`flowchart`或`mermaid`,然后在代码块里面定义图表。 +VNote支持使用以下引擎来绘制图表。您需要使用代码块,并标明特定语言,然后在代码块里面定义图表。 + +- [Flowchart.js](http://flowchart.js.org/),语言为`flow`或`flowchart`; +- [Mermaid](https://mermaidjs.github.io/),语言为`mermaid`; +- [WaveDrom](https://wavedrom.com/),数字时序图,语言为`wavedrom`; + +例如, ```flowchart st=>start: Start:>http://www.google.com[blank] diff --git a/src/resources/hoedown.js b/src/resources/hoedown.js index 943db60c..1ac593f7 100644 --- a/src/resources/hoedown.js +++ b/src/resources/hoedown.js @@ -2,6 +2,10 @@ marked.setOptions({ highlight: function(code, lang) { if (lang) { + if (lang === 'wavedrom') { + lang = 'json'; + } + if (hljs.getLanguage(lang)) { return hljs.highlight(lang, code, true).value; } else { @@ -26,6 +30,8 @@ var updateHtml = function(html) { var codes = document.getElementsByTagName('code'); mermaidIdx = 0; + flowchartIdx = 0; + wavedromIdx = 0; plantUMLIdx = 0; graphvizIdx = 0; for (var i = 0; i < codes.length; ++i) { @@ -47,6 +53,13 @@ var updateHtml = function(html) { --i; continue; } + } else if (VEnableWavedrom && code.classList.contains('language-wavedrom')) { + // Wavedrom code block. + if (renderWavedromOne(code)) { + // replaceChild() will decrease codes.length. + --i; + continue; + } } else if (VEnableMathjax && code.classList.contains('language-mathjax')) { // Mathjax code block. continue; diff --git a/src/resources/markdown-it.js b/src/resources/markdown-it.js index 1e3b4710..58eff9da 100644 --- a/src/resources/markdown-it.js +++ b/src/resources/markdown-it.js @@ -44,6 +44,10 @@ var mdit = window.markdownit({ langPrefix: 'lang-', highlight: function(str, lang) { if (lang && (!specialCodeBlock(lang) || highlightSpecialBlocks)) { + if (lang === 'wavedrom') { + lang = 'json'; + } + if (hljs.getLanguage(lang)) { return hljs.highlight(lang, str, true).value; } else { @@ -167,6 +171,7 @@ var updateText = function(text) { handleMetaData(); renderMermaid('lang-mermaid'); renderFlowchart(['lang-flowchart', 'lang-flow']); + renderWavedrom('lang-wavedrom'); renderPlantUML('lang-puml'); renderGraphviz('lang-dot'); addClassToCodeBlock(); diff --git a/src/resources/markdown_template.js b/src/resources/markdown_template.js index 833c5140..ea1cde5b 100644 --- a/src/resources/markdown_template.js +++ b/src/resources/markdown_template.js @@ -18,6 +18,7 @@ var pendingKeys = []; var VMermaidDivClass = 'mermaid-diagram'; var VFlowchartDivClass = 'flowchart-diagram'; +var VWavedromDivClass = 'wavedrom-diagram'; var VPlantUMLDivClass = 'plantuml-diagram'; var VMetaDataCodeClass = 'markdown-metadata'; var VMarkRectDivClass = 'mark-rect'; @@ -40,6 +41,10 @@ if (typeof VEnableMathjax == 'undefined') { VEnableMathjax = false; } +if (typeof VEnableWavedrom == 'undefined') { + VEnableWavedrom = false; +} + if (typeof VEnableHighlightLineNumber == 'undefined') { VEnableHighlightLineNumber = false; } @@ -707,6 +712,58 @@ var renderFlowchartOne = function(code) { return true; }; +var wavedromIdx = 0; + +var renderWavedrom = function(className) { + if (!VEnableWavedrom) { + return; + } + + var codes = document.getElementsByTagName('code'); + wavedromIdx = 0; + for (var i = 0; i < codes.length; ++i) { + var code = codes[i]; + if (code.classList.contains(className)) { + if (renderWavedromOne(code)) { + // replaceChild() will decrease codes.length. + --i; + } + } + } +}; + +var renderWavedromOne = function(code) { + // Create a script element. + var script = document.createElement('script'); + script.setAttribute('type', 'WaveDrom'); + script.textContent = code.textContent; + script.setAttribute('id', 'WaveDrom_JSON_' + wavedromIdx); + + var preNode = code.parentNode; + preNode.parentNode.replaceChild(script, preNode); + + // Create a div element. + var div = document.createElement('div'); + div.setAttribute('id', 'WaveDrom_Display_' + wavedromIdx); + div.classList.add(VWavedromDivClass); + script.insertAdjacentElement('afterend', div); + + try { + WaveDrom.RenderWaveForm(wavedromIdx, + WaveDrom.eva(script.getAttribute('id')), + 'WaveDrom_Display_'); + } catch (err) { + wavedromIdx++; + content.setLog("err: " + err); + return false; + } + + script.parentNode.removeChild(script); + + wavedromIdx++; + return true; +}; + var plantUMLIdx = 0; var plantUMLCodeClass = 'plantuml_code_'; @@ -1365,7 +1422,8 @@ var specialCodeBlock = function(lang) { || (VEnableMermaid && lang == 'mermaid') || (VEnableFlowchart && (lang == 'flowchart' || lang == 'flow')) || (VPlantUMLMode != 0 && lang == 'puml') - || (VEnableGraphviz && lang == 'dot'); + || (VEnableGraphviz && lang == 'dot') + || (VEnableWavedrom && lang === 'wavedrom'); }; var handlePlantUMLResult = function(id, timeStamp, format, result) { @@ -1449,6 +1507,7 @@ var previewCodeBlock = function(id, lang, text, isLivePreview) { || (lang != 'flow' && lang != 'flowchart' && lang != 'mermaid' + && lang != 'wavedrom' && (lang != 'puml' || VPlantUMLMode != 1 || !isLivePreview))) { return; } @@ -1464,6 +1523,8 @@ var previewCodeBlock = function(id, lang, text, isLivePreview) { renderFlowchartOne(code); } else if (lang == 'mermaid') { renderMermaidOne(code); + } else if (lang == 'wavedrom') { + renderWavedromOne(code); } else if (lang == 'puml') { renderPlantUMLOneOnline(code); } @@ -1873,4 +1934,3 @@ var clearMarkRectDivs = function() { var startFreshRender = function() { skipScrollCheckRange = null; }; - diff --git a/src/resources/marked.js b/src/resources/marked.js index e8583d28..206cef9c 100644 --- a/src/resources/marked.js +++ b/src/resources/marked.js @@ -18,6 +18,10 @@ renderer.heading = function(text, level) { marked.setOptions({ highlight: function(code, lang) { if (lang && (!specialCodeBlock(lang) || highlightSpecialBlocks)) { + if (lang === 'wavedrom') { + lang = 'json'; + } + if (hljs.getLanguage(lang)) { return hljs.highlight(lang, code, true).value; } else { @@ -63,6 +67,7 @@ var updateText = function(text) { setupImageView(); renderMermaid('language-mermaid'); renderFlowchart(['language-flowchart', 'language-flow']); + renderWavedrom('language-wavedrom'); renderPlantUML('language-puml'); renderGraphviz('language-dot'); addClassToCodeBlock(); diff --git a/src/resources/mathjax_preview.js b/src/resources/mathjax_preview.js index 736588a5..22171c16 100644 --- a/src/resources/mathjax_preview.js +++ b/src/resources/mathjax_preview.js @@ -6,6 +6,7 @@ var content; var VMermaidDivClass = 'mermaid-diagram'; var VFlowchartDivClass = 'flowchart-diagram'; +var VWavedromDivClass = 'wavedrom-diagram'; var VPlantUMLDivClass = 'plantuml-diagram'; if (typeof VPlantUMLServer == 'undefined') { @@ -112,6 +113,8 @@ var mermaidIdx = 0; var flowchartIdx = 0; +var wavedromIdx = 0; + if (typeof mermaidAPI != "undefined") { mermaidAPI.parseError = function(err, hash) { mermaidParserErr = true; @@ -135,6 +138,8 @@ var previewDiagram = function(identifier, id, timeStamp, lang, text) { var div = null; if (lang == 'flow' || lang == 'flowchart') { div = renderFlowchartOne(identifier, id, timeStamp, text); + } else if (lang === 'wavedrom') { + div = renderWavedromOne(identifier, id, timeStamp, text); } else if (lang == 'mermaid') { div = renderMermaidOne(identifier, id, timeStamp, text); } else if (lang == 'puml') { @@ -223,6 +228,38 @@ var renderFlowchartOne = function(identifier, id, timeStamp, text) { return div; }; +var renderWavedromOne = function(identifier, id, timeStamp, text) { + // Create a script element. + var script = document.createElement('script'); + script.setAttribute('type', 'WaveDrom'); + script.textContent = text; + script.setAttribute('id', 'WaveDrom_JSON_' + wavedromIdx); + + contentDiv.appendChild(script); + + // Create a div element. + var div = document.createElement('div'); + div.setAttribute('id', 'WaveDrom_Display_' + wavedromIdx); + div.classList.add(VWavedromDivClass); + script.insertAdjacentElement('afterend', div); + + try { + WaveDrom.RenderWaveForm(wavedromIdx, + WaveDrom.eva(script.getAttribute('id')), + 'WaveDrom_Display_'); + } catch (err) { + content.setLog("err: " + err); + contentDiv.removeChild(script); + contentDiv.removeChild(div); + wavedromIdx++; + return null; + } + + contentDiv.removeChild(script); + wavedromIdx++; + return div; +}; + var renderPlantUMLOne = function(identifier, id, timeStamp, text) { var data = { identifier: identifier, id: id, diff --git a/src/resources/showdown.js b/src/resources/showdown.js index 52887f19..6e37b5ee 100644 --- a/src/resources/showdown.js +++ b/src/resources/showdown.js @@ -51,6 +51,7 @@ var mdHasTocSection = function(markdown) { var highlightCodeBlocks = function(doc, enableMermaid, enableFlowchart, + enableWavedrom, enableMathJax, enablePlantUML, enableGraphviz) { @@ -58,6 +59,15 @@ var highlightCodeBlocks = function(doc, for (var i = 0; i < codes.length; ++i) { var code = codes[i]; if (code.parentElement.tagName.toLowerCase() == 'pre') { + if (code.classList.contains('language-wavedrom')) { + if (enableWavedrom) { + continue; + } else { + code.classList.remove('language-wavedrom'); + code.classList.add('language-json'); + } + } + if (enableMermaid && code.classList.contains('language-mermaid')) { // Mermaid code block. continue; @@ -66,6 +76,9 @@ var highlightCodeBlocks = function(doc, || code.classList.contains('language-flow'))) { // Flowchart code block. continue; + } else if (enableWavedrom && code.classList.contains('language-wavedrom')) { + // Wavedrom code block. + continue; } else if (enableMathJax && code.classList.contains('language-mathjax')) { // MathJax code block. continue; @@ -103,11 +116,13 @@ var updateText = function(text) { highlightCodeBlocks(document, VEnableMermaid, VEnableFlowchart, + VEnableWavedrom, VEnableMathjax, VPlantUMLMode != 0, VEnableGraphviz); renderMermaid('language-mermaid'); renderFlowchart(['language-flowchart', 'language-flow']); + renderWavedrom('language-wavedrom'); renderPlantUML('language-puml'); renderGraphviz('language-dot'); addClassToCodeBlock(); diff --git a/src/resources/themes/v_detorte/v_detorte.css b/src/resources/themes/v_detorte/v_detorte.css index af2290f7..73d49c8f 100644 --- a/src/resources/themes/v_detorte/v_detorte.css +++ b/src/resources/themes/v_detorte/v_detorte.css @@ -196,6 +196,15 @@ div.flowchart-diagram { color: #222222; } +div.wavedrom-diagram { + padding: 0px 5px 0px 5px; + margin: 16px 0px 16px 0px; + width: fit-content; + overflow: hidden; + background: #949494; + color: #222222; +} + div.plantuml-diagram { padding: 5px 5px 0px 5px; margin: 16px 0px 16px 0px; diff --git a/src/resources/themes/v_moonlight/v_moonlight.css b/src/resources/themes/v_moonlight/v_moonlight.css index 7908f727..02fffa3a 100644 --- a/src/resources/themes/v_moonlight/v_moonlight.css +++ b/src/resources/themes/v_moonlight/v_moonlight.css @@ -194,6 +194,15 @@ div.flowchart-diagram { color: #6C6C6C; } +div.wavedrom-diagram { + padding: 0px 5px 0px 5px; + margin: 16px 0px 16px 0px; + width: fit-content; + overflow: hidden; + background: #B0BEC5; + color: #6C6C6C; +} + div.plantuml-diagram { padding: 5px 5px 0px 5px; margin: 16px 0px 16px 0px; diff --git a/src/resources/themes/v_native/v_native.css b/src/resources/themes/v_native/v_native.css index adc9f118..a0273fbc 100644 --- a/src/resources/themes/v_native/v_native.css +++ b/src/resources/themes/v_native/v_native.css @@ -190,6 +190,13 @@ div.flowchart-diagram { overflow: hidden; } +div.wavedrom-diagram { + padding: 0px 5px 0px 5px; + margin: 16px 0px 16px 0px; + width: fit-content; + overflow: hidden; +} + div.plantuml-diagram { padding: 5px 5px 0px 5px; margin: 16px 0px 16px 0px; diff --git a/src/resources/themes/v_pure/v_pure.css b/src/resources/themes/v_pure/v_pure.css index 267fec12..69ccbb3b 100644 --- a/src/resources/themes/v_pure/v_pure.css +++ b/src/resources/themes/v_pure/v_pure.css @@ -192,6 +192,13 @@ div.flowchart-diagram { overflow: hidden; } +div.wavedrom-diagram { + padding: 0px 5px 0px 5px; + margin: 16px 0px 16px 0px; + width: fit-content; + overflow: hidden; +} + div.plantuml-diagram { padding: 5px 5px 0px 5px; margin: 16px 0px 16px 0px; diff --git a/src/resources/vnote.ini b/src/resources/vnote.ini index b75e8b5b..ded0fdfd 100644 --- a/src/resources/vnote.ini +++ b/src/resources/vnote.ini @@ -541,3 +541,7 @@ ParseAndPaste=P ; Shortcut could be empty ; Need to escape \ and ", use double quotes to quote paths/arguments with spaces ; SHOULD defined in user config file, not here + +[markdown] +; Enable WaveDrom +enable_wavedrom=false diff --git a/src/utils/vutils.cpp b/src/utils/vutils.cpp index bd71caac..c9d6bc19 100644 --- a/src/utils/vutils.cpp +++ b/src/utils/vutils.cpp @@ -813,6 +813,12 @@ QString VUtils::generateHtmlTemplate(const QString &p_template, } } + if (g_config->getEnableWavedrom()) { + extraFile += "\n" + + "\n" + + "\n"; + } + int plantUMLMode = g_config->getPlantUMLMode(); if (plantUMLMode != PlantUMLMode::DisablePlantUML) { if (plantUMLMode == PlantUMLMode::OnlinePlantUML) { @@ -984,6 +990,9 @@ QString VUtils::generateMathJaxPreviewTemplate() " messageStyle: \"none\"});\n" "\n"; + extraFile += "\n" + + "\n"; + // PlantUML. extraFile += "\n" + "\n" + diff --git a/src/utils/wavedrom/README.md b/src/utils/wavedrom/README.md new file mode 100644 index 00000000..03838eb2 --- /dev/null +++ b/src/utils/wavedrom/README.md @@ -0,0 +1,2 @@ +# [WaveDrom](https://github.com/wavedrom/wavedrom) +v1.6.2 \ No newline at end of file diff --git a/src/utils/wavedrom/wavedrom-theme.js b/src/utils/wavedrom/wavedrom-theme.js new file mode 100644 index 00000000..c6a2ca07 --- /dev/null +++ b/src/utils/wavedrom/wavedrom-theme.js @@ -0,0 +1 @@ +var WaveSkin=WaveSkin||{};WaveSkin.default=["svg",{"id":"svg","xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","height":"0"},["style",{"type":"text/css"},"text{font-size:11pt;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;fill-opacity:1;font-family:Helvetica}.muted{fill:#aaa}.warning{fill:#f6b900}.error{fill:#f60000}.info{fill:#0041c4}.success{fill:#00ab00}.h1{font-size:33pt;font-weight:bold}.h2{font-size:27pt;font-weight:bold}.h3{font-size:20pt;font-weight:bold}.h4{font-size:14pt;font-weight:bold}.h5{font-size:11pt;font-weight:bold}.h6{font-size:8pt;font-weight:bold}.s1{fill:none;stroke:#000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none}.s2{fill:none;stroke:#000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none}.s3{color:#000;fill:none;stroke:#000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate}.s4{color:#000;fill:none;stroke:#000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible}.s5{fill:#fff;stroke:none}.s6{color:#000;fill:#ffffb4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate}.s7{color:#000;fill:#ffe0b9;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate}.s8{color:#000;fill:#b9e0ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate}.s9{fill:#000;fill-opacity:1;stroke:none}.s10{color:#000;fill:#fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate}.s11{fill:#0041c4;fill-opacity:1;stroke:none}.s12{fill:none;stroke:#0041c4;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none}"],["defs",["g",{"id":"socket"},["rect",{"y":"15","x":"6","height":"20","width":"20"}]],["g",{"id":"pclk"},["path",{"d":"M0,20 0,0 20,0","class":"s1"}]],["g",{"id":"nclk"},["path",{"d":"m0,0 0,20 20,0","class":"s1"}]],["g",{"id":"000"},["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"0m0"},["path",{"d":"m0,20 3,0 3,-10 3,10 11,0","class":"s1"}]],["g",{"id":"0m1"},["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"0mx"},["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 5,20","class":"s2"}],["path",{"d":"M20,0 4,16","class":"s2"}],["path",{"d":"M15,0 6,9","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"0md"},["path",{"d":"m8,20 10,0","class":"s3"}],["path",{"d":"m0,20 5,0","class":"s1"}]],["g",{"id":"0mu"},["path",{"d":"m0,20 3,0 C 7,10 10.107603,0 20,0","class":"s1"}]],["g",{"id":"0mz"},["path",{"d":"m0,20 3,0 C 10,10 15,10 20,10","class":"s1"}]],["g",{"id":"111"},["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"1m0"},["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}]],["g",{"id":"1m1"},["path",{"d":"M0,0 3,0 6,10 9,0 20,0","class":"s1"}]],["g",{"id":"1mx"},["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 6,9","class":"s2"}],["path",{"d":"M10,0 5,5","class":"s2"}],["path",{"d":"M3.5,1.5 5,0","class":"s2"}]],["g",{"id":"1md"},["path",{"d":"m0,0 3,0 c 4,10 7,20 17,20","class":"s1"}]],["g",{"id":"1mu"},["path",{"d":"M0,0 5,0","class":"s1"}],["path",{"d":"M8,0 18,0","class":"s3"}]],["g",{"id":"1mz"},["path",{"d":"m0,0 3,0 c 7,10 12,10 17,10","class":"s1"}]],["g",{"id":"xxx"},["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,5 5,0","class":"s2"}],["path",{"d":"M0,10 10,0","class":"s2"}],["path",{"d":"M0,15 15,0","class":"s2"}],["path",{"d":"M0,20 20,0","class":"s2"}],["path",{"d":"M5,20 20,5","class":"s2"}],["path",{"d":"M10,20 20,10","class":"s2"}],["path",{"d":"m15,20 5,-5","class":"s2"}]],["g",{"id":"xm0"},["path",{"d":"M0,0 4,0 9,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,5 4,1","class":"s2"}],["path",{"d":"M0,10 5,5","class":"s2"}],["path",{"d":"M0,15 6,9","class":"s2"}],["path",{"d":"M0,20 7,13","class":"s2"}],["path",{"d":"M5,20 8,17","class":"s2"}]],["g",{"id":"xm1"},["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,20 4,20 9,0","class":"s1"}],["path",{"d":"M0,5 5,0","class":"s2"}],["path",{"d":"M0,10 9,1","class":"s2"}],["path",{"d":"M0,15 7,8","class":"s2"}],["path",{"d":"M0,20 5,15","class":"s2"}]],["g",{"id":"xmx"},["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,5 5,0","class":"s2"}],["path",{"d":"M0,10 10,0","class":"s2"}],["path",{"d":"M0,15 15,0","class":"s2"}],["path",{"d":"M0,20 20,0","class":"s2"}],["path",{"d":"M5,20 20,5","class":"s2"}],["path",{"d":"M10,20 20,10","class":"s2"}],["path",{"d":"m15,20 5,-5","class":"s2"}]],["g",{"id":"xmd"},["path",{"d":"m0,0 4,0 c 3,10 6,20 16,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,5 4,1","class":"s2"}],["path",{"d":"M0,10 5.5,4.5","class":"s2"}],["path",{"d":"M0,15 6.5,8.5","class":"s2"}],["path",{"d":"M0,20 8,12","class":"s2"}],["path",{"d":"m5,20 5,-5","class":"s2"}],["path",{"d":"m10,20 2.5,-2.5","class":"s2"}]],["g",{"id":"xmu"},["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"m0,20 4,0 C 7,10 10,0 20,0","class":"s1"}],["path",{"d":"M0,5 5,0","class":"s2"}],["path",{"d":"M0,10 10,0","class":"s2"}],["path",{"d":"M0,15 10,5","class":"s2"}],["path",{"d":"M0,20 6,14","class":"s2"}]],["g",{"id":"xmz"},["path",{"d":"m0,0 4,0 c 6,10 11,10 16,10","class":"s1"}],["path",{"d":"m0,20 4,0 C 10,10 15,10 20,10","class":"s1"}],["path",{"d":"M0,5 4.5,0.5","class":"s2"}],["path",{"d":"M0,10 6.5,3.5","class":"s2"}],["path",{"d":"M0,15 8.5,6.5","class":"s2"}],["path",{"d":"M0,20 11.5,8.5","class":"s2"}]],["g",{"id":"ddd"},["path",{"d":"m0,20 20,0","class":"s3"}]],["g",{"id":"dm0"},["path",{"d":"m0,20 10,0","class":"s3"}],["path",{"d":"m12,20 8,0","class":"s1"}]],["g",{"id":"dm1"},["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"dmx"},["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 5,20","class":"s2"}],["path",{"d":"M20,0 4,16","class":"s2"}],["path",{"d":"M15,0 6,9","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"dmd"},["path",{"d":"m0,20 20,0","class":"s3"}]],["g",{"id":"dmu"},["path",{"d":"m0,20 3,0 C 7,10 10.107603,0 20,0","class":"s1"}]],["g",{"id":"dmz"},["path",{"d":"m0,20 3,0 C 10,10 15,10 20,10","class":"s1"}]],["g",{"id":"uuu"},["path",{"d":"M0,0 20,0","class":"s3"}]],["g",{"id":"um0"},["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}]],["g",{"id":"um1"},["path",{"d":"M0,0 10,0","class":"s3"}],["path",{"d":"m12,0 8,0","class":"s1"}]],["g",{"id":"umx"},["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 6,9","class":"s2"}],["path",{"d":"M10,0 5,5","class":"s2"}],["path",{"d":"M3.5,1.5 5,0","class":"s2"}]],["g",{"id":"umd"},["path",{"d":"m0,0 3,0 c 4,10 7,20 17,20","class":"s1"}]],["g",{"id":"umu"},["path",{"d":"M0,0 20,0","class":"s3"}]],["g",{"id":"umz"},["path",{"d":"m0,0 3,0 c 7,10 12,10 17,10","class":"s4"}]],["g",{"id":"zzz"},["path",{"d":"m0,10 20,0","class":"s1"}]],["g",{"id":"zm0"},["path",{"d":"m0,10 6,0 3,10 11,0","class":"s1"}]],["g",{"id":"zm1"},["path",{"d":"M0,10 6,10 9,0 20,0","class":"s1"}]],["g",{"id":"zmx"},["path",{"d":"m6,10 3,10 11,0","class":"s1"}],["path",{"d":"M0,10 6,10 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 6.5,8.5","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}]],["g",{"id":"zmd"},["path",{"d":"m0,10 7,0 c 3,5 8,10 13,10","class":"s1"}]],["g",{"id":"zmu"},["path",{"d":"m0,10 7,0 C 10,5 15,0 20,0","class":"s1"}]],["g",{"id":"zmz"},["path",{"d":"m0,10 20,0","class":"s1"}]],["g",{"id":"gap"},["path",{"d":"m7,-2 -4,0 c -5,0 -5,24 -10,24 l 4,0 C 2,22 2,-2 7,-2 z","class":"s5"}],["path",{"d":"M-7,22 C -2,22 -2,-2 3,-2","class":"s1"}],["path",{"d":"M-3,22 C 2,22 2,-2 7,-2","class":"s1"}]],["g",{"id":"0mv-3"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s6"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"1mv-3"},["path",{"d":"M2.875,0 20,0 20,20 9,20 z","class":"s6"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"xmv-3"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s6"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,5 3.5,1.5","class":"s2"}],["path",{"d":"M0,10 4.5,5.5","class":"s2"}],["path",{"d":"M0,15 6,9","class":"s2"}],["path",{"d":"M0,20 4,16","class":"s2"}]],["g",{"id":"dmv-3"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s6"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"umv-3"},["path",{"d":"M3,0 20,0 20,20 9,20 z","class":"s6"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"zmv-3"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s6"}],["path",{"d":"m6,10 3,10 11,0","class":"s1"}],["path",{"d":"M0,10 6,10 9,0 20,0","class":"s1"}]],["g",{"id":"vvv-3"},["path",{"d":"M20,20 0,20 0,0 20,0","class":"s6"}],["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vm0-3"},["path",{"d":"M0,20 0,0 3,0 9,20","class":"s6"}],["path",{"d":"M0,0 3,0 9,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vm1-3"},["path",{"d":"M0,0 0,20 3,20 9,0","class":"s6"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0","class":"s1"}]],["g",{"id":"vmx-3"},["path",{"d":"M0,0 0,20 3,20 6,10 3,0","class":"s6"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 7,8","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}]],["g",{"id":"vmd-3"},["path",{"d":"m0,0 0,20 20,0 C 10,20 7,10 3,0","class":"s6"}],["path",{"d":"m0,0 3,0 c 4,10 7,20 17,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vmu-3"},["path",{"d":"m0,0 0,20 3,0 C 7,10 10,0 20,0","class":"s6"}],["path",{"d":"m0,20 3,0 C 7,10 10,0 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vmz-3"},["path",{"d":"M0,0 3,0 C 10,10 15,10 20,10 15,10 10,10 3,20 L 0,20","class":"s6"}],["path",{"d":"m0,0 3,0 c 7,10 12,10 17,10","class":"s1"}],["path",{"d":"m0,20 3,0 C 10,10 15,10 20,10","class":"s1"}]],["g",{"id":"vmv-3-3"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s6"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s6"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-3-4"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s7"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s6"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-3-5"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s8"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s6"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-4-3"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s6"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s7"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-4-4"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s7"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s7"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-4-5"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s8"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s7"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-5-3"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s6"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s8"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-5-4"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s7"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s8"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-5-5"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s8"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s8"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"0mv-4"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s7"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"1mv-4"},["path",{"d":"M2.875,0 20,0 20,20 9,20 z","class":"s7"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"xmv-4"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s7"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,5 3.5,1.5","class":"s2"}],["path",{"d":"M0,10 4.5,5.5","class":"s2"}],["path",{"d":"M0,15 6,9","class":"s2"}],["path",{"d":"M0,20 4,16","class":"s2"}]],["g",{"id":"dmv-4"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s7"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"umv-4"},["path",{"d":"M3,0 20,0 20,20 9,20 z","class":"s7"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"zmv-4"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s7"}],["path",{"d":"m6,10 3,10 11,0","class":"s1"}],["path",{"d":"M0,10 6,10 9,0 20,0","class":"s1"}]],["g",{"id":"0mv-5"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s8"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"1mv-5"},["path",{"d":"M2.875,0 20,0 20,20 9,20 z","class":"s8"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"xmv-5"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s8"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,5 3.5,1.5","class":"s2"}],["path",{"d":"M0,10 4.5,5.5","class":"s2"}],["path",{"d":"M0,15 6,9","class":"s2"}],["path",{"d":"M0,20 4,16","class":"s2"}]],["g",{"id":"dmv-5"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s8"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"umv-5"},["path",{"d":"M3,0 20,0 20,20 9,20 z","class":"s8"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"zmv-5"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s8"}],["path",{"d":"m6,10 3,10 11,0","class":"s1"}],["path",{"d":"M0,10 6,10 9,0 20,0","class":"s1"}]],["g",{"id":"vvv-4"},["path",{"d":"M20,20 0,20 0,0 20,0","class":"s7"}],["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vm0-4"},["path",{"d":"M0,20 0,0 3,0 9,20","class":"s7"}],["path",{"d":"M0,0 3,0 9,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vm1-4"},["path",{"d":"M0,0 0,20 3,20 9,0","class":"s7"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0","class":"s1"}]],["g",{"id":"vmx-4"},["path",{"d":"M0,0 0,20 3,20 6,10 3,0","class":"s7"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 7,8","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}]],["g",{"id":"vmd-4"},["path",{"d":"m0,0 0,20 20,0 C 10,20 7,10 3,0","class":"s7"}],["path",{"d":"m0,0 3,0 c 4,10 7,20 17,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vmu-4"},["path",{"d":"m0,0 0,20 3,0 C 7,10 10,0 20,0","class":"s7"}],["path",{"d":"m0,20 3,0 C 7,10 10,0 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vmz-4"},["path",{"d":"M0,0 3,0 C 10,10 15,10 20,10 15,10 10,10 3,20 L 0,20","class":"s7"}],["path",{"d":"m0,0 3,0 c 7,10 12,10 17,10","class":"s1"}],["path",{"d":"m0,20 3,0 C 10,10 15,10 20,10","class":"s1"}]],["g",{"id":"vvv-5"},["path",{"d":"M20,20 0,20 0,0 20,0","class":"s8"}],["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vm0-5"},["path",{"d":"M0,20 0,0 3,0 9,20","class":"s8"}],["path",{"d":"M0,0 3,0 9,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vm1-5"},["path",{"d":"M0,0 0,20 3,20 9,0","class":"s8"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0","class":"s1"}]],["g",{"id":"vmx-5"},["path",{"d":"M0,0 0,20 3,20 6,10 3,0","class":"s8"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 7,8","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}]],["g",{"id":"vmd-5"},["path",{"d":"m0,0 0,20 20,0 C 10,20 7,10 3,0","class":"s8"}],["path",{"d":"m0,0 3,0 c 4,10 7,20 17,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vmu-5"},["path",{"d":"m0,0 0,20 3,0 C 7,10 10,0 20,0","class":"s8"}],["path",{"d":"m0,20 3,0 C 7,10 10,0 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vmz-5"},["path",{"d":"M0,0 3,0 C 10,10 15,10 20,10 15,10 10,10 3,20 L 0,20","class":"s8"}],["path",{"d":"m0,0 3,0 c 7,10 12,10 17,10","class":"s1"}],["path",{"d":"m0,20 3,0 C 10,10 15,10 20,10","class":"s1"}]],["g",{"id":"Pclk"},["path",{"d":"M-3,12 0,3 3,12 C 1,11 -1,11 -3,12 z","class":"s9"}],["path",{"d":"M0,20 0,0 20,0","class":"s1"}]],["g",{"id":"Nclk"},["path",{"d":"M-3,8 0,17 3,8 C 1,9 -1,9 -3,8 z","class":"s9"}],["path",{"d":"m0,0 0,20 20,0","class":"s1"}]],["g",{"id":"vvv-2"},["path",{"d":"M20,20 0,20 0,0 20,0","class":"s10"}],["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vm0-2"},["path",{"d":"M0,20 0,0 3,0 9,20","class":"s10"}],["path",{"d":"M0,0 3,0 9,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vm1-2"},["path",{"d":"M0,0 0,20 3,20 9,0","class":"s10"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0","class":"s1"}]],["g",{"id":"vmx-2"},["path",{"d":"M0,0 0,20 3,20 6,10 3,0","class":"s10"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 7,8","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}]],["g",{"id":"vmd-2"},["path",{"d":"m0,0 0,20 20,0 C 10,20 7,10 3,0","class":"s10"}],["path",{"d":"m0,0 3,0 c 4,10 7,20 17,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vmu-2"},["path",{"d":"m0,0 0,20 3,0 C 7,10 10,0 20,0","class":"s10"}],["path",{"d":"m0,20 3,0 C 7,10 10,0 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vmz-2"},["path",{"d":"M0,0 3,0 C 10,10 15,10 20,10 15,10 10,10 3,20 L 0,20","class":"s10"}],["path",{"d":"m0,0 3,0 c 7,10 12,10 17,10","class":"s1"}],["path",{"d":"m0,20 3,0 C 10,10 15,10 20,10","class":"s1"}]],["g",{"id":"0mv-2"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s10"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"1mv-2"},["path",{"d":"M2.875,0 20,0 20,20 9,20 z","class":"s10"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"xmv-2"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s10"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,5 3.5,1.5","class":"s2"}],["path",{"d":"M0,10 4.5,5.5","class":"s2"}],["path",{"d":"M0,15 6,9","class":"s2"}],["path",{"d":"M0,20 4,16","class":"s2"}]],["g",{"id":"dmv-2"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s10"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"umv-2"},["path",{"d":"M3,0 20,0 20,20 9,20 z","class":"s10"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"zmv-2"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s10"}],["path",{"d":"m6,10 3,10 11,0","class":"s1"}],["path",{"d":"M0,10 6,10 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-3-2"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s10"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s6"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-4-2"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s10"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s7"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-5-2"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s10"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s8"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-2-3"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s6"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s10"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-2-4"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s7"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s10"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-2-5"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s8"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s10"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-2-2"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s10"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s10"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"arrow0"},["path",{"d":"m-12,-3 9,3 -9,3 c 1,-2 1,-4 0,-6 z","class":"s11"}],["path",{"d":"M0,0 -15,0","class":"s12"}]],["marker",{"id":"arrowhead","style":"fill:#0041c4","markerHeight":"7","markerWidth":"10","markerUnits":"strokeWidth","viewBox":"0 -4 11 8","refX":"15","refY":"0","orient":"auto"},["path",{"d":"M0 -4 11 0 0 4z"}]],["marker",{"id":"arrowtail","style":"fill:#0041c4","markerHeight":"7","markerWidth":"10","markerUnits":"strokeWidth","viewBox":"-11 -4 11 8","refX":"-15","refY":"0","orient":"auto"},["path",{"d":"M0 -4 -11 0 0 4z"}]]],["g",{"id":"waves"},["g",{"id":"lanes"}],["g",{"id":"groups"}]]]; diff --git a/src/utils/wavedrom/wavedrom.min.js b/src/utils/wavedrom/wavedrom.min.js new file mode 100644 index 00000000..8d1b960f --- /dev/null +++ b/src/utils/wavedrom/wavedrom.min.js @@ -0,0 +1,3 @@ +/*! wavedrom 2017-11-08 */ + +!function e(t,r,n){function s(a,i){if(!r[a]){if(!t[a]){var l="function"==typeof require&&require;if(!i&&l)return l(a,!0);if(o)return o(a,!0);var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var u=r[a]={exports:{}};t[a][0].call(u.exports,function(e){var r=t[a][1][e];return s(r||e)},u,u.exports,e,t,r,n)}return r[a].exports}for(var o="function"==typeof require&&require,a=0;at+s.offsetWidth||e.yn+s.offsetHeight)&&(s.parentNode.removeChild(s),document.body.removeEventListener("mousedown",r,!1))}var n,s;(n=document.getElementById(t+e)).childNodes[0].addEventListener("contextmenu",function(o){var a,i,l;(s=document.createElement("div")).className="wavedromMenu",s.style.top=o.y+"px",s.style.left=o.x+"px",a=document.createElement("ul"),(i=document.createElement("li")).innerHTML="Save as PNG",a.appendChild(i),(l=document.createElement("li")).innerHTML="Save as SVG",a.appendChild(l),s.appendChild(a),document.body.appendChild(s),i.addEventListener("click",function(){var o,a,i,l,c,u,d;o="",0!==e&&(o+=(a=document.getElementById(t+0)).innerHTML.substring(166,a.innerHTML.indexOf(''))),o=[n.innerHTML.slice(0,166),o,n.innerHTML.slice(166)].join(""),i="data:image/svg+xml;base64,"+btoa(o),(l=new Image).src=i,(c=document.createElement("canvas")).width=l.width,c.height=l.height,c.getContext("2d").drawImage(l,0,0),u=c.toDataURL("image/png"),(d=document.createElement("a")).href=u,d.download="wavedrom.png",d.click(),s.parentNode.removeChild(s),document.body.removeEventListener("mousedown",r,!1)},!1),l.addEventListener("click",function(){var o,a,i,l;o="",0!==e&&(o+=(a=document.getElementById(t+0)).innerHTML.substring(166,a.innerHTML.indexOf(''))),o=[n.innerHTML.slice(0,166),o,n.innerHTML.slice(166)].join(""),i="data:image/svg+xml;base64,"+btoa(o),(l=document.createElement("a")).href=i,l.download="wavedrom.svg",l.click(),s.parentNode.removeChild(s),document.body.removeEventListener("mousedown",r,!1)},!1),s.addEventListener("contextmenu",function(e){e.preventDefault()},!1),document.body.addEventListener("mousedown",r,!1),o.preventDefault()},!1)}},{}],2:[function(e,t,r){"use strict";var n=e("./jsonml-parse");t.exports=n},{"./jsonml-parse":15}],3:[function(e,t,r){"use strict";var n=e("./eva"),s=e("./render-wave-form");t.exports=function(){s(0,n("InputJSON_0"),"WaveDrom_Display_")}},{"./eva":4,"./render-wave-form":29}],4:[function(require,module,exports){"use strict";function eva(id){function erra(e){return{signal:[{name:["tspan",["tspan",{class:"error h5"},"Error: "],e.message]}]}}var TheTextBox,source;if((TheTextBox=document.getElementById(id)).type&&"textarea"===TheTextBox.type)try{source=eval("("+TheTextBox.value+")")}catch(e){return erra(e)}else try{source=eval("("+TheTextBox.innerHTML+")")}catch(e){return erra(e)}if("[object Object]"!==Object.prototype.toString.call(source))return erra({message:'[Semantic]: The root has to be an Object: "{signal:[...]}"'});if(source.signal){if("[object Array]"!==Object.prototype.toString.call(source.signal))return erra({message:'[Semantic]: "signal" object has to be an Array "signal:[]"'})}else if(source.assign){if("[object Array]"!==Object.prototype.toString.call(source.assign))return erra({message:'[Semantic]: "assign" object hasto be an Array "assign:[]"'})}else if(!source.reg)return erra({message:'[Semantic]: "signal:[...]" or "assign:[...]" property is missing inside the root Object'});return source}module.exports=eva},{}],5:[function(e,t,r){"use strict";t.exports=function(e){var t=0,r=0,n=[];return e.forEach(function(e){"vvv-2"===e||"vvv-3"===e||"vvv-4"===e||"vvv-5"===e?r+=1:0!==r&&(n.push(t-(r+1)/2),r=0),t+=1}),0!==r&&n.push(t-(r+1)/2),n}},{}],6:[function(e,t,r){"use strict";t.exports=function(e,t,r){var n,s,o=[];if(4===e.length){for(s=0;s");e.tagName===r.tagName&&(e=r)}catch(e){console.log(e)}for(var i in t)if(t.hasOwnProperty(i)){var l=t[i];i&&null!==l&&void 0!==l&&("style"===(i=s[i.toLowerCase()]||i)?void 0!==e.style.cssText?e.style.cssText=l:e.style=l:a[i]?(n(e,i,l),o[i]&&n(e,o[i],l)):"string"==typeof l||"number"==typeof l||"boolean"==typeof l?(e.setAttribute(i,l),o[i]&&e.setAttribute(o[i],l)):(e[i]=l,o[i]&&(e[o[i]]=l)))}return e}},{}],13:[function(e,t,r){"use strict";t.exports=function(e,t){t&&(e.tagName&&"style"===e.tagName.toLowerCase()&&document.createStyleSheet?e.cssText=t:!1!==e.canHaveChildren&&e.appendChild(t))}},{}],14:[function(e,t,r){"use strict";var n=e("./jsonml-trim-whitespace");t.exports=function(e){var t=document.createElement("div");if(t.innerHTML=e,n(t),1===t.childNodes.length)return t.firstChild;for(var r=document.createDocumentFragment?document.createDocumentFragment():document.createElement("");t.firstChild;)r.appendChild(t.firstChild);return r}},{"./jsonml-trim-whitespace":16}],15:[function(e,t,r){"use strict";function n(e){return e instanceof Array&&"string"==typeof e[0]}function s(e,t,r){return document.createTextNode("["+e+"-"+r+"]")}var o,a,i=e("./jsonml-hydrate"),l=e("./w3"),c=e("./jsonml-append-child"),u=e("./jsonml-add-attributes"),d=e("./jsonml-trim-whitespace");o=function(e,t,r){for(var n=1;n0?Math.round(e):1}(e.config.hscale)))>0&&(r>100&&(r=100),t.hscale=r),t.yh0=0,t.yh1=0,t.head=e.head,t.xmin_cfg=0,t.xmax_cfg=1e12,e&&e.config&&e.config.hbounds&&2==e.config.hbounds.length&&(e.config.hbounds[0]=Math.floor(e.config.hbounds[0]),e.config.hbounds[1]=Math.ceil(e.config.hbounds[1]),e.config.hbounds[0]"===l&&(u=!1,l=f.shift()),a=1;"."===f[0]||"|"===f[0];)f.shift(),a+=1;h=u?h.concat(s(i+l,0,a-r.period)):h.concat(s(i+l,t,a))}for(c=0;c0?(d=o(m).length,1==o([m[m.length-1]]).length&&1==o([h[0]]).length&&(d-=1)):d=0,[h,d]}},{"./find-lane-markers":5,"./gen-first-wave-brick":7,"./gen-wave-brick":8}],20:[function(e,t,r){"use strict";function n(e,t){var r;return void 0===(r=e.data)?null:("string"==typeof r&&(r=r.split(" ")),r=r.slice(t))}var s=e("./parse-wave-lane");t.exports=function(e,t){var r,o,a,i,l,c=[],u=[];for(r in e)o=e[r],t.period=o.period?o.period:1,t.phase=(o.phase?2*o.phase:0)+t.xmin_cfg,c.push([]),u[0]=o.name||" ",u[1]=(o.phase||0)+t.xmin_cfg/2,o.wave?(a=(i=s(o.wave,t.period*t.hscale-1,t))[0],l=i[1]):a=null,c[c.length-1][0]=u.slice(0),c[c.length-1][1]=a,c[c.length-1][2]=n(o,l);return c}},{"./parse-wave-lane":19}],21:[function(e,t,r){"use strict";var n=e("./eva"),s=e("./append-save-as-dialog"),o=e("./render-wave-form");t.exports=function(){var e,t,r,a;for(r=0,e=document.querySelectorAll("*"),t=0;tdiv.wavedromMenu{position:fixed;border:solid 1pt#CCCCCC;background-color:white;box-shadow:0px 10px 20px #808080;cursor:default;margin:0px;padding:0px;}div.wavedromMenu>ul{margin:0px;padding:0px;}div.wavedromMenu>ul>li{padding:2px 10px;list-style:none;}div.wavedromMenu>ul>li:hover{background-color:#b5d5ff;}'}},{"./append-save-as-dialog":1,"./eva":4,"./render-wave-form":29}],22:[function(e,t,r){"use strict";function n(e,t){var r,s,o={},a={x:10};for("string"!=typeof e[0]&&"number"!=typeof e[0]||(s=e[0],a.x=25),t.x+=a.x,r=0;r":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none");break;case"~>":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","M "+x.x+","+x.y+" c "+.7*v+", 0 "+.3*v+", "+y+" "+v+", "+y);break;case"-~>":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","M "+x.x+","+x.y+" c "+.7*v+", 0 "+v+", "+y+" "+v+", "+y),_.label&&(b=x.x+.75*(g.x-x.x));break;case"~->":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","M "+x.x+","+x.y+" c 0, 0 "+.3*v+", "+y+" "+v+", "+y),_.label&&(b=x.x+.25*(g.x-x.x));break;case"-|>":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","m "+x.x+","+x.y+" "+v+",0 0,"+y),_.label&&(b=g.x);break;case"|->":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","m "+x.x+","+x.y+" 0,"+y+" "+v+",0"),_.label&&(b=x.x);break;case"-|->":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","m "+x.x+","+x.y+" "+v/2+",0 0,"+y+" "+v/2+",0");break;case"<->":k.setAttribute("style","marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none");break;case"<~>":k.setAttribute("style","marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","M "+x.x+","+x.y+" c "+.7*v+", 0 "+.3*v+", "+y+" "+v+", "+y);break;case"<-~>":k.setAttribute("style","marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","M "+x.x+","+x.y+" c "+.7*v+", 0 "+v+", "+y+" "+v+", "+y),_.label&&(b=x.x+.75*(g.x-x.x));break;case"<-|>":k.setAttribute("style","marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","m "+x.x+","+x.y+" "+v+",0 0,"+y),_.label&&(b=g.x);break;case"<-|->":k.setAttribute("style","marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","m "+x.x+","+x.y+" "+v/2+",0 0,"+y+" "+v/2+",0");break;default:k.setAttribute("style","fill:none;stroke:#F00;stroke-width:1")}_.label&&(m.setAttribute("x",b),m.setAttribute("y",w+3),p.setAttribute("x",b-N/2),p.setAttribute("y",w-5))}for(u in E)u===u.toLowerCase()&&E[u].x>0&&(p=s(["rect",{y:E[u].y-4,height:8,style:"fill:#FFF;"}]),m=s(["text",{style:"font-size:8px;",x:E[u].x,y:E[u].y+2,"text-anchor":"middle"},u+""]),l.insertBefore(p,null),l.insertBefore(m,null),N=m.getBBox().width+2,p.setAttribute("x",E[u].x-N/2),p.setAttribute("width",N))}}},{"./create-element":2,"./w3":31,tspan:35}],24:[function(e,t,r){"use strict";function n(e,t){var r,s,o;for(t.xmax=Math.max(t.xmax,t.x),r=t.y,o=e.length,s=1;s"===f&&(d=!1,f=h.shift()),c+=d?1:2*s.period,"|"===f&&((l=document.createElementNS(n.svg,"use")).setAttributeNS(n.xlink,"xlink:href","#gap"),l.setAttribute("transform","translate("+s.xs*((c-(d?0:s.period))*s.hscale-s.phase)+")"),i.insertBefore(l,null))}}},{"./w3":31}],26:[function(e,t,r){"use strict";var n=e("tspan");t.exports=function(e,t,r){var s,o,a,i=["g"];return e.forEach(function(e,l){i.push(["path",{id:"group_"+l+"_"+t,d:"m "+(e.x+.5)+","+(e.y*r.yo+3.5+r.yh0+r.yh1)+" c -3,0 -5,2 -5,5 l 0,"+(e.height*r.yo-16)+" c 0,3 2,5 5,5",style:"stroke:#0041c4;stroke-width:1;fill:none"}]),void 0!==e.name&&(s=e.x-10,o=r.yo*(e.y+e.height/2)+r.yh0+r.yh1,(a=n.parse(e.name)).unshift("text",{"text-anchor":"middle",class:"info","xml:space":"preserve"}),i.push(["g",{transform:"translate("+s+","+o+")"},["g",{transform:"rotate(270)"},a]]))}),i}},{tspan:35}],27:[function(e,t,r){"use strict";var n=e("tspan"),s=e("./create-element");t.exports=function(e,t,r,o){function a(e,t,r){var o;e[t]&&e[t].text&&((o=n.parse(e[t].text)).unshift("text",{x:e.xmax*e.xs/2,y:r,"text-anchor":"middle",fill:"#000","xml:space":"preserve"}),o=s(o),c.insertBefore(o,null))}function i(e,t,r,o,a,i,u){var d,f,h,m,p=1,x=0,g=[];if(void 0!==e[t]&&void 0!==e[t][r]){if("string"==typeof(h=e[t][r]))h=h.split(" ");else if("number"==typeof h||"boolean"==typeof h)for(f=Number(h),h=[],l=0;l0?Math.ceil(2*x)-2*x:-2*x,f=s(["g",{id:"wavelane_draw_"+c+"_"+r,transform:"translate("+x*i.xs+", 0)"}]),d.insertBefore(f,null),t[c][1])){for(l=0;lv&&(v=t[c][1].length)}return i.xmax=Math.min(v,i.xmax_cfg-i.xmin_cfg),i.xg=20,y}},{"./create-element":2,"./find-lane-markers":5,"./w3":31,tspan:35}],31:[function(e,t,r){"use strict";t.exports={svg:"http://www.w3.org/2000/svg",xlink:"http://www.w3.org/1999/xlink",xmlns:"http://www.w3.org/XML/1998/namespace"}},{}],32:[function(e,t,r){"use strict";window.WaveDrom=window.WaveDrom||{};var n=e("./");window.WaveDrom.ProcessAll=n.processAll,window.WaveDrom.RenderWaveForm=n.renderWaveForm,window.WaveDrom.EditorRefresh=n.editorRefresh,window.WaveDrom.eva=n.eva},{"./":9}],33:[function(e,t,r){"use strict";t.exports=window.WaveSkin},{}],34:[function(e,t,r){"use strict";function n(e,t){return"translate("+e+","+t+")"}function s(e,t,r){var n=["line"],s={};return t?(s.x1=t,s.x2=t+e):s.x2=e,r&&(s.y1=r,s.y2=r),n.push(s),n}function o(e,t,r){var n=["line"],s={};return t&&(s.x1=t,s.x2=t),r?(s.y1=r,s.y2=r+e):s.y2=e,n.push(s),n}function a(e,t){var r=t.hspace/t.mod,s=["g",{transform:n(r/2,t.vspace/5)}],o=["g",{transform:n(r/2,t.vspace/2+4)}],a=["g",{transform:n(r/2,t.vspace)}],i=["g",{transform:n(0,t.vspace/4)}],l=t.fontsize,c=t.fontfamily,d=t.fontweight;return e.forEach(function(e){var n,f,h,m,p,x;if(h=0,m=t.mod-1,p=t.index*t.mod,x=(t.index+1)*t.mod-1,e.lsb/t.mod>>0===t.index)h=e.lsbm,p=e.lsb,e.msb/t.mod>>0===t.index&&(x=e.msb,m=e.msbm);else{if(e.msb/t.mod>>0!==t.index)return;x=e.msb,m=e.msbm}s.push(["text",{x:r*(t.mod-h-1),"font-size":l,"font-family":c,"font-weight":d},p.toString()]),h!==m&&s.push(["text",{x:r*(t.mod-m-1),"font-size":l,"font-family":c,"font-weight":d},x.toString()]),e.name?((n=u.parse(e.name)).unshift({x:r*(t.mod-(m+h)/2-1),"font-size":l,"font-family":c,"font-weight":d}),n.unshift("text"),o.push(n)):i.push(["rect",{style:"fill-opacity:0.1",x:r*(t.mod-m-1),y:0,width:r*(m-h+1),height:t.vspace/2}]),e.attr&&((f=u.parse(e.attr)).unshift({x:r*(t.mod-(m+h)/2-1),"font-size":l,"font-family":c,"font-weight":d}),f.unshift("text"),a.push(f))}),["g",i,s,o,a]}function i(e,t){return["g",{"text-anchor":"middle"},a(e,t)]}function l(e,t){var r=t.hspace,a=t.vspace,i=t.mod,l=["g",{stroke:"black","stroke-width":1,"stroke-linecap":"round",transform:n(0,a/4)}];l.push(s(r)),l.push(o(a/2)),l.push(s(r,0,a/2));var c=t.index*t.mod,u=t.mod;do{u===t.mod||e.some(function(e){return e.lsb===c})?l.push(o(a/2,u*(r/i))):(l.push(o(a/16,u*(r/i))),l.push(o(a/16,u*(r/i),7*a/16))),c++,u--}while(u);return l}function c(e,t){var r=["g",{transform:n(4.5,(t.lanes-t.index-1)*t.vspace+.5)}];return r.push(l(e,t)),r.push(i(e,t)),r}var u=e("tspan");t.exports=function(e,t){(t=t||{}).vspace=t.vspace||80,t.hspace=t.hspace||640,t.lanes=t.lanes||2,t.bits=t.bits||32,t.bigendian=t.bigendian||!1,t.fontfamily=t.fontfamily||"sans-serif",t.fontweight=t.fontweight||"normal",t.fontsize=t.fontsize||14;var r=["svg",{xmlns:"http://www.w3.org/2000/svg",width:t.hspace+9,height:t.vspace*t.lanes+5,viewBox:[0,0,t.hspace+9,t.vspace*t.lanes+5].join(" ")}],n=0,s=t.bits/t.lanes;t.mod=s,e.forEach(function(e){e.lsb=n,e.lsbm=n%s,n+=e.bits,e.msb=n-1,e.msbm=e.msb%s});var o;for(o=0;o0&&(t[r]=n.join(" ")),t},{})}var o=/||||||||<\/o>|<\/ins>|<\/s>|<\/sub>|<\/sup>|<\/b>|<\/i>|<\/tt>/,a={"":{add:"text-decoration overline"},"":{del:"text-decoration overline"},"":{add:"text-decoration underline"},"":{del:"text-decoration underline"},"":{add:"text-decoration line-through"},"":{del:"text-decoration line-through"},"":{add:"font-weight bold"},"":{del:"font-weight bold"},"":{add:"font-style italic"},"":{del:"font-style italic"},"":{add:"baseline-shift sub;font-size .7em"},"":{del:"baseline-shift sub;font-size .7em"},"":{add:"baseline-shift super;font-size .7em"},"":{del:"baseline-shift super;font-size .7em"},"":{add:"font-family monospace"},"":{del:"font-family monospace"}};t.exports=function(e){var t,r,i,l,c;if(void 0===e)return[];if("number"==typeof e)return[e+""];if("string"!=typeof e)return[e];for(r=[],t={"text-decoration":{},"font-weight":{},"font-style":{},"baseline-shift":{},"font-size":{},"font-family":{}};;){if(-1===(i=e.search(o)))return r.push(["tspan",s(t),e]),r;if(i>0&&(c=e.slice(0,i),r.push(["tspan",s(t),c])),l=e.match(o)[0],n(t,a[l]),0===(e=e.slice(i+l.length)).length)return r}}},{}],37:[function(e,t,r){"use strict";function n(e){var t=e.match(/(\w+)-(\w)(\w+)/);return null===t?e:t[1]+t[2].toUpperCase()+t[3]}var s=e("./parse");t.exports=function(e){function t(e,t){var s=e[0],o=e[1],a=Object.keys(o).reduce(function(e,t){return e[n(t)]=o[t],e},{}),i=e[2];return o.key=t,r(s,a,i)}var r=e.createElement;return function(e){return s(e).map(t)}}},{"./parse":36}]},{},[32]); \ No newline at end of file diff --git a/src/vconfigmanager.cpp b/src/vconfigmanager.cpp index 9e7d03d1..45b88fa6 100644 --- a/src/vconfigmanager.cpp +++ b/src/vconfigmanager.cpp @@ -327,26 +327,30 @@ void VConfigManager::initialize() "highlight_matches_in_page").toBool(); initEditorConfigs(); + + initMarkdownConfigs(); } void VConfigManager::initEditorConfigs() { - m_autoIndent = getConfigFromSettings("editor", "auto_indent").toBool(); + const QString section("editor"); - m_autoList = getConfigFromSettings("editor", "auto_list").toBool(); + m_autoIndent = getConfigFromSettings(section, "auto_indent").toBool(); - m_autoQuote = getConfigFromSettings("editor", "auto_quote").toBool(); + m_autoList = getConfigFromSettings(section, "auto_list").toBool(); - int keyMode = getConfigFromSettings("editor", "key_mode").toInt(); + m_autoQuote = getConfigFromSettings(section, "auto_quote").toBool(); + + int keyMode = getConfigFromSettings(section, "key_mode").toInt(); if (keyMode < 0 || keyMode >= (int)KeyMode::Invalid) { keyMode = 0; } m_keyMode = (KeyMode)keyMode; - m_enableSmartImInVimMode = getConfigFromSettings("editor", + m_enableSmartImInVimMode = getConfigFromSettings(section, "enable_smart_im_in_vim_mode").toBool(); - QString tmpLeader = getConfigFromSettings("editor", + QString tmpLeader = getConfigFromSettings(section, "vim_leader_key").toString(); if (tmpLeader.isEmpty()) { m_vimLeaderKey = QChar(' '); @@ -357,16 +361,22 @@ void VConfigManager::initEditorConfigs() } } - m_enableTabHighlight = getConfigFromSettings("editor", + m_enableTabHighlight = getConfigFromSettings(section, "enable_tab_highlight").toBool(); - m_parsePasteLocalImage = getConfigFromSettings("editor", "parse_paste_local_image").toBool(); + m_parsePasteLocalImage = getConfigFromSettings(section, "parse_paste_local_image").toBool(); - m_enableExtraBuffer = getConfigFromSettings("editor", "enable_extra_buffer").toBool(); + m_enableExtraBuffer = getConfigFromSettings(section, "enable_extra_buffer").toBool(); - m_autoScrollCursorLine = getConfigFromSettings("editor", "auto_scroll_cursor_line").toInt(); + m_autoScrollCursorLine = getConfigFromSettings(section, "auto_scroll_cursor_line").toInt(); - m_editorFontFamily = getConfigFromSettings("editor", "editor_font_family").toString(); + m_editorFontFamily = getConfigFromSettings(section, "editor_font_family").toString(); +} + +void VConfigManager::initMarkdownConfigs() +{ + const QString section("markdown"); + m_enableWavedrom = getConfigFromSettings(section, "enable_wavedrom").toBool(); } void VConfigManager::initSettings() diff --git a/src/vconfigmanager.h b/src/vconfigmanager.h index 8af9f06d..0a853fd9 100644 --- a/src/vconfigmanager.h +++ b/src/vconfigmanager.h @@ -89,8 +89,6 @@ public: void initialize(); - void initEditorConfigs(); - // Read config from the directory config json file into a QJsonObject. // @path is the directory containing the config json file. static QJsonObject readDirectoryConfig(const QString &path); @@ -266,6 +264,9 @@ public: bool getEnableMathjax() const; void setEnableMathjax(bool p_enabled); + bool getEnableWavedrom() const; + void setEnableWavedrom(bool p_enabled); + bool getEnableGraphviz() const; void setEnableGraphviz(bool p_enabled); @@ -625,6 +626,10 @@ public: void setImageBrowsePath(const QString &p_path); private: + void initEditorConfigs(); + + void initMarkdownConfigs(); + // Look up a config from user and default settings. QVariant getConfigFromSettings(const QString §ion, const QString &key) const; @@ -782,6 +787,9 @@ private: // Enable Mathjax. bool m_enableMathjax; + // Enable WaveDrom. + bool m_enableWavedrom; + // Enable Graphviz. bool m_enableGraphviz; @@ -1605,6 +1613,21 @@ inline void VConfigManager::setEnableMathjax(bool p_enabled) setConfigToSettings("global", "enable_mathjax", m_enableMathjax); } +inline bool VConfigManager::getEnableWavedrom() const +{ + return m_enableWavedrom; +} + +inline void VConfigManager::setEnableWavedrom(bool p_enabled) +{ + if (m_enableWavedrom == p_enabled) { + return; + } + + m_enableWavedrom = p_enabled; + setConfigToSettings("markdown", "enable_wavedrom", m_enableWavedrom); +} + inline bool VConfigManager::getEnableGraphviz() const { return m_enableGraphviz; diff --git a/src/vlivepreviewhelper.cpp b/src/vlivepreviewhelper.cpp index e4525e99..1e8d8129 100644 --- a/src/vlivepreviewhelper.cpp +++ b/src/vlivepreviewhelper.cpp @@ -104,6 +104,7 @@ VLivePreviewHelper::VLivePreviewHelper(VEditor *p_editor, m_flowchartEnabled = g_config->getEnableFlowchart(); m_mermaidEnabled = g_config->getEnableMermaid(); + m_wavedromEnabled = g_config->getEnableWavedrom(); m_plantUMLMode = g_config->getPlantUMLMode(); m_graphvizEnabled = g_config->getEnableGraphviz(); m_mathjaxEnabled = g_config->getEnableMathjax(); @@ -123,6 +124,9 @@ void VLivePreviewHelper::checkLang(const QString &p_lang, { if (m_flowchartEnabled && (p_lang == "flow" || p_lang == "flowchart")) { p_livePreview = p_inplacePreview = true; + } else if (m_wavedromEnabled && p_lang == "wavedrom") { + p_livePreview = true; + p_inplacePreview = false; } else if (m_plantUMLMode != PlantUMLMode::DisablePlantUML && p_lang == "puml") { p_livePreview = p_inplacePreview = true; } else if (m_graphvizEnabled && p_lang == "dot") { diff --git a/src/vlivepreviewhelper.h b/src/vlivepreviewhelper.h index e339ada6..00e20dec 100644 --- a/src/vlivepreviewhelper.h +++ b/src/vlivepreviewhelper.h @@ -282,6 +282,7 @@ private: bool m_flowchartEnabled; bool m_mermaidEnabled; + bool m_wavedromEnabled; int m_plantUMLMode; bool m_graphvizEnabled; bool m_mathjaxEnabled; diff --git a/src/vmainwindow.cpp b/src/vmainwindow.cpp index c9f3763c..baae36dd 100644 --- a/src/vmainwindow.cpp +++ b/src/vmainwindow.cpp @@ -453,7 +453,7 @@ QToolBar *VMainWindow::initViewToolBar(QSize p_iconSize) viewMenu->addAction(menuBarAct); expandViewAct = new QAction(VIconUtils::toolButtonIcon(":/resources/icons/expand.svg"), - tr("Expand"), + tr("Expand Edit Area"), this); VUtils::fixTextWithCaptainShortcut(expandViewAct, "ExpandMode"); expandViewAct->setStatusTip(tr("Expand the edit area")); @@ -933,34 +933,7 @@ void VMainWindow::initMarkdownMenu() markdownMenu->addSeparator(); - QAction *mermaidAct = new QAction(tr("&Mermaid Diagram"), this); - mermaidAct->setToolTip(tr("Enable Mermaid for graph and diagram (re-open current tabs to make it work)")); - mermaidAct->setCheckable(true); - connect(mermaidAct, &QAction::triggered, - this, &VMainWindow::enableMermaid); - markdownMenu->addAction(mermaidAct); - - mermaidAct->setChecked(g_config->getEnableMermaid()); - - QAction *flowchartAct = new QAction(tr("&Flowchart.js"), this); - flowchartAct->setToolTip(tr("Enable Flowchart.js for flowchart diagram (re-open current tabs to make it work)")); - flowchartAct->setCheckable(true); - connect(flowchartAct, &QAction::triggered, - this, [this](bool p_enabled){ - g_config->setEnableFlowchart(p_enabled); - VUtils::promptForReopen(this); - }); - markdownMenu->addAction(flowchartAct); - flowchartAct->setChecked(g_config->getEnableFlowchart()); - - QAction *mathjaxAct = new QAction(tr("Math&Jax"), this); - mathjaxAct->setToolTip(tr("Enable MathJax for math support in Markdown (re-open current tabs to make it work)")); - mathjaxAct->setCheckable(true); - connect(mathjaxAct, &QAction::triggered, - this, &VMainWindow::enableMathjax); - markdownMenu->addAction(mathjaxAct); - - mathjaxAct->setChecked(g_config->getEnableMathjax()); + initMarkdownExtensionMenu(markdownMenu); markdownMenu->addSeparator(); @@ -1683,6 +1656,50 @@ void VMainWindow::initMarkdownitOptionMenu(QMenu *p_menu) optMenu->addAction(emojiAct); } +void VMainWindow::initMarkdownExtensionMenu(QMenu *p_menu) +{ + QMenu *optMenu = p_menu->addMenu(tr("Extensions")); + optMenu->setToolTipsVisible(true); + + QAction *mermaidAct = new QAction(tr("&Mermaid Diagram"), optMenu); + mermaidAct->setToolTip(tr("Enable Mermaid for graph and diagram (re-open current tabs to make it work)")); + mermaidAct->setCheckable(true); + mermaidAct->setChecked(g_config->getEnableMermaid()); + connect(mermaidAct, &QAction::triggered, + this, &VMainWindow::enableMermaid); + optMenu->addAction(mermaidAct); + + QAction *flowchartAct = new QAction(tr("&Flowchart.js"), optMenu); + flowchartAct->setToolTip(tr("Enable Flowchart.js for flowchart diagram (re-open current tabs to make it work)")); + flowchartAct->setCheckable(true); + flowchartAct->setChecked(g_config->getEnableFlowchart()); + connect(flowchartAct, &QAction::triggered, + this, [this](bool p_enabled){ + g_config->setEnableFlowchart(p_enabled); + VUtils::promptForReopen(this); + }); + optMenu->addAction(flowchartAct); + + QAction *mathjaxAct = new QAction(tr("Math&Jax"), optMenu); + mathjaxAct->setToolTip(tr("Enable MathJax for math support in Markdown (re-open current tabs to make it work)")); + mathjaxAct->setCheckable(true); + mathjaxAct->setChecked(g_config->getEnableMathjax()); + connect(mathjaxAct, &QAction::triggered, + this, &VMainWindow::enableMathjax); + optMenu->addAction(mathjaxAct); + + QAction *wavedromAct = new QAction(tr("&WaveDrom"), optMenu); + wavedromAct->setToolTip(tr("Enable WaveDrom for digital timing diagram (re-open current tabs to make it work)")); + wavedromAct->setCheckable(true); + wavedromAct->setChecked(g_config->getEnableWavedrom()); + connect(wavedromAct, &QAction::triggered, + this, [this](bool p_enabled){ + g_config->setEnableWavedrom(p_enabled); + VUtils::promptForReopen(this); + }); + optMenu->addAction(wavedromAct); +} + void VMainWindow::initRenderBackgroundMenu(QMenu *menu) { QActionGroup *renderBackgroundAct = new QActionGroup(this); diff --git a/src/vmainwindow.h b/src/vmainwindow.h index 4a1f0b28..13b82bc8 100644 --- a/src/vmainwindow.h +++ b/src/vmainwindow.h @@ -258,7 +258,11 @@ private: void initCodeBlockStyleMenu(QMenu *p_menu); void initConverterMenu(QMenu *p_menu); + void initMarkdownitOptionMenu(QMenu *p_menu); + + void initMarkdownExtensionMenu(QMenu *p_menu); + void initEditorBackgroundMenu(QMenu *menu); // Init the Line Number submenu in Edit menu. diff --git a/src/vnote.cpp b/src/vnote.cpp index 66527dc3..09b90bb2 100644 --- a/src/vnote.cpp +++ b/src/vnote.cpp @@ -58,6 +58,9 @@ const QString VNote::c_mermaidForestCssFile = ":/utils/mermaid/mermaid.forest.cs const QString VNote::c_flowchartJsFile = ":/utils/flowchart.js/flowchart.min.js"; const QString VNote::c_raphaelJsFile = ":/utils/flowchart.js/raphael.min.js"; +const QString VNote::c_wavedromJsFile = ":/utils/wavedrom/wavedrom.min.js"; +const QString VNote::c_wavedromThemeFile = ":/utils/wavedrom/wavedrom-theme.js"; + const QString VNote::c_plantUMLJsFile = "http://s.plantuml.com/synchro2.js"; const QString VNote::c_plantUMLZopfliJsFile = "http://s.plantuml.com/zopfli.raw.min.js"; diff --git a/src/vnote.h b/src/vnote.h index beb3e2c5..333523d0 100644 --- a/src/vnote.h +++ b/src/vnote.h @@ -73,6 +73,10 @@ public: static const QString c_flowchartJsFile; static const QString c_raphaelJsFile; + // WaveDrom + static const QString c_wavedromJsFile; + static const QString c_wavedromThemeFile; + // PlantUML static const QString c_plantUMLJsFile; static const QString c_plantUMLZopfliJsFile; diff --git a/src/vnote.qrc b/src/vnote.qrc index 9b2efaa9..d79c033f 100644 --- a/src/vnote.qrc +++ b/src/vnote.qrc @@ -278,5 +278,7 @@ resources/icons/256x256/vnote.png utils/markdown-it/markdown-it-container.min.js resources/icons/table.svg + utils/wavedrom/wavedrom.min.js + utils/wavedrom/wavedrom-theme.js