From d938325e4c935f41f94d21fd053d3ba1d597682a Mon Sep 17 00:00:00 2001 From: Liu Yongliang <41845017+tlylt@users.noreply.github.com> Date: Sat, 5 Aug 2023 14:51:11 +0800 Subject: [PATCH 1/3] Invoke plantuml jar from the respective working directory (#2344) --- packages/core/src/plugins/default/markbind-plugin-plantuml.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/src/plugins/default/markbind-plugin-plantuml.ts b/packages/core/src/plugins/default/markbind-plugin-plantuml.ts index 85c12ef615..72739e6c82 100644 --- a/packages/core/src/plugins/default/markbind-plugin-plantuml.ts +++ b/packages/core/src/plugins/default/markbind-plugin-plantuml.ts @@ -40,7 +40,9 @@ function generateDiagram(imageOutputPath: string, content: string) { // Java command to launch PlantUML jar const cmd = `java -jar "${JAR_PATH}" -nometadata -pipe > "${imageOutputPath}"`; - const childProcess = exec(cmd); + const childProcess = exec(cmd, { + cwd: outputDir, // Invoke image generation in the same directory to avoid file inclusion issues + }); let errorLog = ''; childProcess.stdin?.write( From d6ad99d375dbba465d6d4c949201b1e2cc33e944 Mon Sep 17 00:00:00 2001 From: SPWwj Date: Sat, 5 Aug 2023 18:54:39 +0800 Subject: [PATCH 2/3] Add custom icon support to lists (#2316) --- docs/images/detailed-d.png | Bin 0 -> 18743 bytes docs/images/overview-d.png | Bin 0 -> 19584 bytes docs/userGuide/syntax/lists.md | 105 +++- .../test_site/expected/siteData.json | 6 + .../test_site/expected/testList.html | 566 ++++++++++++++++++ .../expected/testList.page-vue-render.js | 88 +++ .../cli/test/functional/test_site/site.json | 4 + .../cli/test/functional/test_site/testList.md | 98 +++ .../core/src/html/CustomListIconProcessor.ts | 182 ++++++ packages/core/src/html/NodeProcessor.ts | 4 + packages/core/src/lib/markdown-it/index.ts | 2 +- .../patches/markdown-it-emoji-fixed.js | 2 +- .../markdown-it/plugins/markdown-it-icons.ts | 162 +++-- 13 files changed, 1154 insertions(+), 65 deletions(-) create mode 100644 docs/images/detailed-d.png create mode 100644 docs/images/overview-d.png create mode 100644 packages/cli/test/functional/test_site/expected/testList.html create mode 100644 packages/cli/test/functional/test_site/expected/testList.page-vue-render.js create mode 100644 packages/cli/test/functional/test_site/testList.md create mode 100644 packages/core/src/html/CustomListIconProcessor.ts diff --git a/docs/images/detailed-d.png b/docs/images/detailed-d.png new file mode 100644 index 0000000000000000000000000000000000000000..4d255e8a2f2d0b3f9b9bc13d58ce301f97ba69dc GIT binary patch literal 18743 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 +****Customizing the Unordered list appearance:**** + +**To customize unordered lists' icons, add the configuration `{icon="icon-name"}` after a specific list item.** + + +markdown + +* Item 1 { icon="glyphicon-education" } +* Item 2 + * Item 2.1 { icon="fas-file-code" } + * Item 2.2 +* Item 3 { icon="fas-code-branch" } + * Item 3.1 +* Item 4 { icon="octicon-git-pull-request" } + * Item 4.1 { icon="mif-perm-media" } +* Item 5 { icon="glyphicon-education" } + * Item 5.1 { icon="notebook_with_decorative_cover" } + + + +You can use any of the [icons](../formattingContents.html#icons) supported by MarkBind. If an item has a specified icon, that icon will be used for it and for subsequent items at that level. + + +If you customize any item on a certain level, you must also customize the first item on that level. If not, the list will revert to its uncustomized form. + + +**You can adjust the icon's size by using the `i-size` attribute.** + + +markdown + + +* Item 1 { icon="fas-file-code" i-size="35px" } +* Item 2 { icon="fas-file-code" i-size="4rem" } +* Item 3 { icon="fas-file-code" i-size="5em" } + + + + +You can utilize any [CSS size unit](https://www.w3schools.com/cssref/css_units.php). + +**You can also use images as icons.** + + +markdown + + +* Item 1 { icon="/images/deer.jpg" i-width="30px" } +* Item 2 { i-width="60px" i-height="44px" } +* Item 3 { i-width="90px" i-height="61px" } + + + + +If either the `i-width` or the `i-height` of an image is not specified, the unspecified dimension will adjust to maintain the image's original aspect ratio. For example, for an image of size 800x600 (4:3), if `i-width` is set to 400px, its height will be 300px. + +**The icon's appearance can be further customized by adding a `i-class` attribute.** + +
+ + +markdown + +* Item 1 { icon="/images/deer.jpg" i-width="60px" height="17px" i-class="rounded" } +* Item 2 + * Item 2.1 { icon="fas-question-circle" i-class="badge rounded-pill my-1 bg-success text-white" } + * Item 2.2 + * Item 2.3 { i-class="badge rounded-pill my-1 bg-primary text-white"} +* Item 3 + * Item 3.1 + * Item 3.2 { icon="fas-question-circle" i-class="badge rounded my-1 bg-danger text-white" } + * Item 3.3 + + + + + +Similar to the `icon` attribute, other icon attributes such as `i-class`, `i-width`, `i-height` apply for subsequent list items at the same level, until they are overridden by the same attribute. For example, Item 2.3's `i-class` overrides Item 2.1's and applies up to Item 3.1. + + +
+ +**You can apply Markdown's heading and paragraph syntax within the list.** + + +markdown + + +* #### Heading 1: Overview {icon="/images/overview-d.png" i-width="65px" i-class="rounded" } + Content 1: This section provides a summary of the document or topic. + It sets the context and purpose of the content to follow. +* #### Heading 2: Detailed Description { icon="/images/detailed-d.png" i-width="65px" i-class="rounded" } + Content 2: This section delves deeper into the topic, offering comprehensive information and detailed explanations. + It might also include evidence, examples, or justifications. + + + +Icon specifications should be attached only to the first element of a list item (for the example above, the icon specification should be attached to the heading, not the content below the heading). + ****Ordered lists:**** @@ -23,9 +122,9 @@ 1. Item 1 1. Sub item 1.1 - 1. Sub item 1.2 -1. Item 2 -1. Item 3 + 2. Sub item 1.2 +2. Item 2 +3. Item 3 diff --git a/packages/cli/test/functional/test_site/expected/siteData.json b/packages/cli/test/functional/test_site/expected/siteData.json index 5c1dbd94e4..b3c7a54479 100644 --- a/packages/cli/test/functional/test_site/expected/siteData.json +++ b/packages/cli/test/functional/test_site/expected/siteData.json @@ -415,6 +415,12 @@ "i-am-a-header": "🚀 I am a header" }, "headingKeywords": {} + }, + { + "src": "testList.md", + "title": "web 3 forms", + "headings": {}, + "headingKeywords": {} } ] } diff --git a/packages/cli/test/functional/test_site/expected/testList.html b/packages/cli/test/functional/test_site/expected/testList.html new file mode 100644 index 0000000000..28e33e2d0d --- /dev/null +++ b/packages/cli/test/functional/test_site/expected/testList.html @@ -0,0 +1,566 @@ + + + + + + + + + + + + + web 3 forms + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + +
  • Open Bugs
  • +
    +
    +
    + Test Jumbotron
    +
    +
    +
    +

    Relative Link Test This is a relative Intra-Site link in a layout (see link)

    +
    +
    + + + + +
    + +
      +
    1. One item
    2. +
    +
      +
    • Only 1 item
    • +
    +
      +
    1. One item with customization
    2. +
    +
      +
    • +
      Only 1 item
      +
    • +
    +
      +
    1. One item + nested list
    2. +
    +
      +
    • Only 1 item +
        +
      • Only 1 item
      • +
      +
    • +
    +
      +
    1. One item + nested list with customization
    2. +
    +
      +
    • +
      Only 1 item +
        +
      • +
        Only 1 item
        +
      • +
      +
      +
    • +
    +
      +
    1. Basic structure
    2. +
    +
      +
    • Item A
    • +
    • Item B +
        +
      • Sub-item B1
      • +
      • Sub-item B2
      • +
      • Sub-item B3 +
          +
        • Sub-sub-item B3.1
        • +
        • Sub-sub-item B3.2 +
            +
          • Sub-sub-sub-item B3.2.1
          • +
          +
        • +
        +
      • +
      • Sub-item B4
      • +
      +
    • +
    +
      +
    1. Icon inheritance test
    2. +
    +
      +
    • +
      Item A
      +
    • +
    • +
      Item B +
        +
      • +
        Sub-item B1
        +
      • +
      • +
        Sub-item B2
        +
      • +
      • +
        Sub-item B3 +
          +
        • Icon​​ +
          Sub-sub-item B3.1
          +
        • +
        • Icon​​ +
          Sub-sub-item B3.2 +
            +
          • Sub-sub-sub-item B3.2.1
          • +
          +
          +
        • +
        +
        +
      • +
      • +
        Sub-item B4
        +
      • +
      +
      +
    • +
    +
      +
    1. First item no customization test
    2. +
    +
      +
    • Item A
    • +
    • Item B +
        +
      • Sub-item B1
      • +
      • Sub-item B2
      • +
      • Sub-item B3 +
          +
        • Sub-sub-item B3.1
        • +
        • Sub-sub-item B3.2
        • +
        • Sub-sub-sub-item B3.2.1
        • +
        +
      • +
      • Sub-item B4
      • +
      +
    • +
    +
      +
    1. Correct first item customization test
    2. +
    +
      +
    • +
      Item A
      +
    • +
    • Icon​​ +
      Item B +
        +
      • +
        Sub-item B1
        +
      • +
      • +
        Sub-item B2
        +
      • +
      • +
        Sub-item B3 +
          +
        • Icon​​ +
          Sub-sub-item B3.1
          +
        • +
        • Icon​​ +
          Sub-sub-item B3.2 +
            +
          • Sub-sub-sub-item B3.2.1
          • +
          +
          +
        • +
        +
        +
      • +
      • +
        Sub-item B4
        +
      • +
      +
      +
    • +
    +
      +
    1. Testing with various attributes
    2. +
    +
      +
    • +
      Item A
      +
    • +
    • Icon​​ +
      Item B +
        +
      • +
        Sub-item B1
        +
      • +
      • +
        Sub-item B2
        +
      • +
      • +
        Sub-item B3 +
          +
        • Icon​​ +
          Sub-sub-item B3.1
          +
        • +
        • Icon​​ +
          Sub-sub-item B3.2 +
            +
          • Sub-sub-sub-item B3.2.1
          • +
          +
          +
        • +
        +
        +
      • +
      • +
        Sub-item B4
        +
      • +
      +
      +
    • +
    +
      +
    1. Mixing basic and customized lists
    2. +
    +
      +
    • Item A
    • +
    • Item B +
        +
      • +
        Sub-item B1
        +
      • +
      • +
        Sub-item B2
        +
      • +
      • +
        Sub-item B3 +
          +
        • +
          Sub-sub-item B3.1
          +
        • +
        • +
          Sub-sub-item B3.2 +
            +
          • Icon​​ +
            Sub-sub-sub-item B3.2.1
            +
          • +
          +
          +
        • +
        +
        +
      • +
      • +
        Sub-item B4
        +
      • +
      +
    • +
    +
      +
    1. Reverse mixing basic and customized lists
    2. +
    +
      +
    • +
      Item A
      +
    • +
    • +
      Item B +
        +
      • Sub-item B1
      • +
      • Sub-item B2
      • +
      • Sub-item B3 +
          +
        • Sub-sub-item B3.1
        • +
        • Sub-sub-item B3.2 +
            +
          • Sub-sub-sub-item B3.2.1
          • +
          +
        • +
        +
      • +
      • Sub-item B4
      • +
      +
      +
    • +
    +
      +
    1. Every second list item customized
    2. +
    +
      +
    • +
      Item A
      +
    • +
    • +
      Item B +
        +
      • +
        Sub-item B1
        +
      • +
      • +
        Sub-item B2
        +
      • +
      • Icon​​ +
        Sub-item B3
        +
      • +
      • Icon​​ +
        Sub-item B4
        +
      • +
      +
      +
    • +
    +
    + + + + +
    +
    +
    +

    Heading in footer should not be indexed

    +
    + This is a dynamic height footer that supports markdown 😄! +
    +
    +
    +
    + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/cli/test/functional/test_site/expected/testList.page-vue-render.js b/packages/cli/test/functional/test_site/expected/testList.page-vue-render.js new file mode 100644 index 0000000000..dbb4414f52 --- /dev/null +++ b/packages/cli/test/functional/test_site/expected/testList.page-vue-render.js @@ -0,0 +1,88 @@ + + var pageVueRenderFn = function anonymous( +) { +with(this){return _c('div',{attrs:{"id":"app"}},[_c('div',[_c('header',[_c('navbar',{attrs:{"type":"dark","default-highlight-on":"sibling-or-child"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/","title":"Home"}},[_v("MarkBind Test Site")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/test_site/bugs/index.html"}},[_v("Open Bugs")])])]),_v(" "),_m(0)],1),_v(" "),_m(1)]),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('overlay-source',{attrs:{"id":"site-nav","tag-name":"nav","to":"site-nav"}},[_c('div',{staticClass:"site-nav-top"},[_c('div',{staticClass:"fw-bold mb-2",staticStyle:{"font-size":"1.25rem"}},[_c('div',[_c('h2',{attrs:{"id":"default-layout"}},[_v("Default Layout"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#default-layout","onclick":"event.stopPropagation()"}})])])])]),_v(" "),_c('div',{staticClass:"nav-component slim-scroll"},[_c('div',[_c('site-nav',[_c('overlay-source',{staticClass:"site-nav-list site-nav-list-root",attrs:{"tag-name":"ul","to":"mb-site-nav"}},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/test_site/index.html"}},[_v("Home 🏠")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/test_site/bugs/index.html"}},[_v("Open Bugs 🐛")])])]),_v(" "),_c('li',{staticClass:"site-nav-custom-list-item site-nav-list-item-0"},[_c('h3',{attrs:{"id":"testing-site-nav"}},[_v("Testing Site-Nav"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testing-site-nav","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('strong',[_v("Dropdown ")]),_v(" "),_c('span',{staticClass:"glyphicon glyphicon-search",attrs:{"aria-hidden":"true"}}),_v(" title ✏️ "),_v(" "),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"https://www.google.com/"}},[_v("Dropdown link one")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"https://www.google.com/"}},[_v("Html within site-nav "),_c('span',{staticStyle:{"color":"red"}},[_v("should")]),_v(" be displayed properly")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Nested Dropdown title 📐\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-2",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"https://www.google.com/"}},[_c('strong',[_v("Nested")]),_v(" Dropdown link one")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-2",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"https://www.google.com/"}},[_c('strong',[_v("Nested")]),_v(" Dropdown link two")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"https://www.google.com/"}},[_v("Dropdown link two")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"https://www.google.com/"}},[_c('mark',[_v("Third Link")]),_v(" 📋")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Filler text "),_c('a',{attrs:{"href":"https://www.youtube.com/"}},[_c('span',{staticClass:"glyphicon glyphicon-facetime-video",attrs:{"aria-hidden":"true"}}),_v(" Youtube 📺")]),_v(" filler text"),_v(" "),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"https://www.youtube.com/watch?v=dQw4w9WgXcQ"}},[_v("The answer to everything in the universe")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('mark',[_v("Dropdown title")]),_v(" "),_c('span',{staticClass:"glyphicon glyphicon-comment",attrs:{"aria-hidden":"true"}}),_v(" ✏️ "),_v(" "),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-2",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"https://www.google.com/"}},[_c('strong',[_v("Nested")]),_v(" Dropdown link one")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Really Long Dropdown Title Really Long Dropdown Title Really Long Dropdown Title Really Long Dropdown\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',{staticClass:"site-nav-custom-list-item site-nav-list-item-1"},[_v("Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text Really Really Long Text")]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Nested Dropdown Title\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',{staticClass:"site-nav-custom-list-item site-nav-list-item-2"},[_v("Hello Doge Hello Doge 🐶")]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-2",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/test_site/index.html"}},[_c('strong',[_v("NESTED LINK")]),_v(" Home 🏠")])])]),_v(" "),_c('li',{staticClass:"site-nav-custom-list-item site-nav-list-item-2"},[_v("Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit Text cut off from height limit")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Test line break in navigation layout\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',{staticClass:"site-nav-custom-list-item site-nav-list-item-1"},[_v("Nested line break text ✂️")]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/test_site/index.html"}},[_v("Nested line break href")]),_v(" "),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',{staticClass:"site-nav-custom-list-item site-nav-list-item-2"},[_v("Nested Nested line break text ✂️")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Nested line break dropdown menu\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',{staticClass:"site-nav-custom-list-item site-nav-list-item-2"},[_v("Line break item 2 📘")])])])])])])],1)],1)])]),_v(" "),_c('div',{attrs:{"id":"content-wrapper"}},[_c('breadcrumb'),_v(" "),_m(2),_v(" "),_m(3),_v(" "),_m(4),_v(" "),_m(5),_v(" "),_m(6),_v(" "),_m(7),_v(" "),_m(8),_v(" "),_m(9),_v(" "),_m(10),_v(" "),_m(11),_v(" "),_m(12),_v(" "),_m(13),_v(" "),_m(14),_v(" "),_m(15),_v(" "),_m(16),_v(" "),_m(17),_v(" "),_m(18),_v(" "),_m(19),_v(" "),_m(20),_v(" "),_m(21),_v(" "),_m(22),_v(" "),_m(23),_v(" "),_m(24),_v(" "),_m(25)],1),_v(" "),_c('overlay-source',{attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"})]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(26)])} +}; + var pageVueStaticRenderFns = [function anonymous( +) { +with(this){return _c('div',{staticClass:"bg-info display-4 text-center text-white"},[_c('br'),_v("\n Test Jumbotron"),_c('br'),_v(" "),_c('br')])} +},function anonymous( +) { +with(this){return _c('p',[_c('strong',[_v("Relative Link Test")]),_v(" This is a relative Intra-Site link in a layout (see "),_c('a',{attrs:{"href":"/test_site/index.html#heading-with-hidden-keyword"}},[_v("link")]),_v(")")])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("One item")])])} +},function anonymous( +) { +with(this){return _c('ul',[_c('li',[_v("Only 1 item")])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("One item with customization")])])} +},function anonymous( +) { +with(this){return _c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Only 1 item")])])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("One item + nested list")])])} +},function anonymous( +) { +with(this){return _c('ul',[_c('li',[_v("Only 1 item\n"),_c('ul',[_c('li',[_v("Only 1 item")])])])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("One item + nested list with customization")])])} +},function anonymous( +) { +with(this){return _c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Only 1 item\n"),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Only 1 item")])])])])])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("Basic structure")])])} +},function anonymous( +) { +with(this){return _c('ul',[_c('li',[_v("Item A")]),_v(" "),_c('li',[_v("Item B\n"),_c('ul',[_c('li',[_v("Sub-item B1")]),_v(" "),_c('li',[_v("Sub-item B2")]),_v(" "),_c('li',[_v("Sub-item B3\n"),_c('ul',[_c('li',[_v("Sub-sub-item B3.1")]),_v(" "),_c('li',[_v("Sub-sub-item B3.2\n"),_c('ul',[_c('li',[_v("Sub-sub-sub-item B3.2.1")])])])])]),_v(" "),_c('li',[_v("Sub-item B4")])])])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("Icon inheritance test")])])} +},function anonymous( +) { +with(this){return _c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Item A")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Item B\n"),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B1")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B2")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B3\n"),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"padding-bottom":"0.3em","padding-top":"0.3em","font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"}},[_c('img',{staticStyle:{"width":"50px","display":"inline-block"},attrs:{"src":"/test_site/images/deer.jpg","alt":"Icon"}}),_v("​​")]),_c('div',[_v("Sub-sub-item B3.1")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"padding-bottom":"0.3em","padding-top":"0.3em","font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"}},[_c('img',{staticStyle:{"width":"50px","display":"inline-block"},attrs:{"src":"/test_site/images/deer.jpg","alt":"Icon"}}),_v("​​")]),_c('div',[_v("Sub-sub-item B3.2\n"),_c('ul',[_c('li',[_v("Sub-sub-sub-item B3.2.1")])])])])])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B4")])])])])])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("First item no customization test")])])} +},function anonymous( +) { +with(this){return _c('ul',[_c('li',[_v("Item A")]),_v(" "),_c('li',{attrs:{"icon":"./images/deer.jpg"}},[_v("Item B\n"),_c('ul',[_c('li',[_v("Sub-item B1")]),_v(" "),_c('li',{attrs:{"icon":"fas-file-code"}},[_v("Sub-item B2")]),_v(" "),_c('li',[_v("Sub-item B3\n"),_c('ul',[_c('li',[_v("Sub-sub-item B3.1")]),_v(" "),_c('li',{attrs:{"icon":"./images/deer.jpg","i-width":"50px"}},[_v("Sub-sub-item B3.2")]),_v(" "),_c('li',[_v("Sub-sub-sub-item B3.2.1")])])]),_v(" "),_c('li',[_v("Sub-item B4")])])])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("Correct first item customization test")])])} +},function anonymous( +) { +with(this){return _c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Item A")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"padding-bottom":"0.3em","padding-top":"0.3em","font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"}},[_c('img',{staticStyle:{"display":"inline-block"},attrs:{"src":"/test_site/images/deer.jpg","alt":"Icon"}}),_v("​​")]),_c('div',[_v("Item B\n"),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B1")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B2")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B3\n"),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"padding-bottom":"0.3em","padding-top":"0.3em","font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"}},[_c('img',{staticStyle:{"width":"50px","display":"inline-block"},attrs:{"src":"/test_site/images/deer.jpg","alt":"Icon"}}),_v("​​")]),_c('div',[_v("Sub-sub-item B3.1")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"padding-bottom":"0.3em","padding-top":"0.3em","font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"}},[_c('img',{staticStyle:{"width":"50px","display":"inline-block"},attrs:{"src":"/test_site/images/deer.jpg","alt":"Icon"}}),_v("​​")]),_c('div',[_v("Sub-sub-item B3.2\n"),_c('ul',[_c('li',[_v("Sub-sub-sub-item B3.2.1")])])])])])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B4")])])])])])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("Testing with various attributes")])])} +},function anonymous( +) { +with(this){return _c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education text-primary",staticStyle:{"font-size":"20px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Item A")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"padding-bottom":"0.3em","padding-top":"0.3em","font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"}},[_c('img',{staticClass:"text-warning",staticStyle:{"width":"200px","height":"100px","display":"inline-block"},attrs:{"src":"/test_site/images/deer.jpg","alt":"Icon"}}),_v("​​")]),_c('div',[_v("Item B\n"),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code",staticStyle:{"font-size":"30px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B1")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code text-success",staticStyle:{"font-size":"30px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B2")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code text-success",staticStyle:{"font-size":"30px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B3\n"),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"padding-bottom":"0.3em","padding-top":"0.3em","font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"}},[_c('img',{staticStyle:{"width":"50px","height":"50px","display":"inline-block"},attrs:{"src":"/test_site/images/deer.jpg","alt":"Icon"}}),_v("​​")]),_c('div',[_v("Sub-sub-item B3.1")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"padding-bottom":"0.3em","padding-top":"0.3em","font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"}},[_c('img',{staticStyle:{"width":"50px","height":"50px","display":"inline-block"},attrs:{"src":"/test_site/images/deer.jpg","alt":"Icon"}}),_v("​​")]),_c('div',[_v("Sub-sub-item B3.2\n"),_c('ul',[_c('li',{attrs:{"i-class":"text-danger"}},[_v("Sub-sub-sub-item B3.2.1")])])])])])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code text-success",staticStyle:{"font-size":"30px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B4")])])])])])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("Mixing basic and customized lists")])])} +},function anonymous( +) { +with(this){return _c('ul',[_c('li',[_v("Item A")]),_v(" "),_c('li',[_v("Item B\n"),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code text-success",staticStyle:{"font-size":"20px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B1")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code text-success",staticStyle:{"font-size":"20px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B2")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code text-success",staticStyle:{"font-size":"20px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B3\n"),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education text-danger",staticStyle:{"font-size":"30px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-sub-item B3.1")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education text-danger",staticStyle:{"font-size":"30px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-sub-item B3.2\n"),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"padding-bottom":"0.3em","padding-top":"0.3em","font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"}},[_c('img',{staticClass:"text-warning",staticStyle:{"width":"200px","height":"100px","display":"inline-block"},attrs:{"src":"/test_site/images/deer.jpg","alt":"Icon"}}),_v("​​")]),_c('div',[_v("Sub-sub-sub-item B3.2.1")])])])])])])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code text-success",staticStyle:{"font-size":"20px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B4")])])])])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("Reverse mixing basic and customized lists")])])} +},function anonymous( +) { +with(this){return _c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education text-primary",staticStyle:{"font-size":"20px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Item A")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education text-primary",staticStyle:{"font-size":"20px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Item B\n"),_c('ul',[_c('li',[_v("Sub-item B1")]),_v(" "),_c('li',[_v("Sub-item B2")]),_v(" "),_c('li',[_v("Sub-item B3\n"),_c('ul',[_c('li',[_v("Sub-sub-item B3.1")]),_v(" "),_c('li',[_v("Sub-sub-item B3.2\n"),_c('ul',[_c('li',[_v("Sub-sub-sub-item B3.2.1")])])])])]),_v(" "),_c('li',[_v("Sub-item B4")])])])])])} +},function anonymous( +) { +with(this){return _c('ol',[_c('li',[_v("Every second list item customized")])])} +},function anonymous( +) { +with(this){return _c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education text-primary",staticStyle:{"font-size":"20px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Item A")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"glyphicon glyphicon-education text-primary",staticStyle:{"font-size":"20px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Item B\n"),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code text-success",staticStyle:{"font-size":"30px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B1")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-file-code text-success",staticStyle:{"font-size":"30px","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("Sub-item B2")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"padding-bottom":"0.3em","padding-top":"0.3em","font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"}},[_c('img',{staticClass:"text-warning",staticStyle:{"width":"200px","height":"100px","display":"inline-block"},attrs:{"src":"/test_site/images/deer.jpg","alt":"Icon"}}),_v("​​")]),_c('div',[_v("Sub-item B3")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"padding-bottom":"0.3em","padding-top":"0.3em","font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"}},[_c('img',{staticClass:"text-warning",staticStyle:{"width":"200px","height":"100px","display":"inline-block"},attrs:{"src":"/test_site/images/deer.jpg","alt":"Icon"}}),_v("​​")]),_c('div',[_v("Sub-item B4")])])])])])])} +},function anonymous( +) { +with(this){return _c('div',[_c('footer',[_c('h1',{attrs:{"id":"heading-in-footer-should-not-be-indexed"}},[_v("Heading in footer should not be indexed"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#heading-in-footer-should-not-be-indexed","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"text-center"},[_v("\n This is a dynamic height footer that supports markdown "),_c('span',[_v("😄")]),_v("!\n ")])])])} +}]; + \ No newline at end of file diff --git a/packages/cli/test/functional/test_site/site.json b/packages/cli/test/functional/test_site/site.json index 387173d215..b2053ea460 100644 --- a/packages/cli/test/functional/test_site/site.json +++ b/packages/cli/test/functional/test_site/site.json @@ -169,6 +169,10 @@ { "src": "testWeb3FormPlugin.md", "title": "web 3 forms" + }, + { + "src": "testList.md", + "title": "web 3 forms" } ], "pagesExclude": ["**/*-fragment.md"], diff --git a/packages/cli/test/functional/test_site/testList.md b/packages/cli/test/functional/test_site/testList.md new file mode 100644 index 0000000000..dd7ce4b35c --- /dev/null +++ b/packages/cli/test/functional/test_site/testList.md @@ -0,0 +1,98 @@ +1. One item +- Only 1 item + +1. One item with customization +- Only 1 item { icon="glyphicon-education" } + +1. One item + nested list +- Only 1 item + - Only 1 item + +1. One item + nested list with customization +- Only 1 item { icon="glyphicon-education" } + - Only 1 item { icon="glyphicon-education" } + +1. Basic structure +* Item A +* Item B + * Sub-item B1 + * Sub-item B2 + * Sub-item B3 + * Sub-sub-item B3.1 + * Sub-sub-item B3.2 + * Sub-sub-sub-item B3.2.1 + * Sub-item B4 + +1. Icon inheritance test +* Item A { icon="glyphicon-education" } +* Item B + * Sub-item B1 { icon="fas-file-code" } + * Sub-item B2 + * Sub-item B3 + * Sub-sub-item B3.1 { icon="./images/deer.jpg" i-width="50px" } + * Sub-sub-item B3.2 + * Sub-sub-sub-item B3.2.1 + * Sub-item B4 + +1. First item no customization test +* Item A +* Item B { icon="./images/deer.jpg" } + * Sub-item B1 + * Sub-item B2 { icon="fas-file-code" } + * Sub-item B3 + * Sub-sub-item B3.1 + * Sub-sub-item B3.2 { icon="./images/deer.jpg" i-width="50px" } + * Sub-sub-sub-item B3.2.1 + * Sub-item B4 + +1. Correct first item customization test +* Item A { icon="glyphicon-education" } +* Item B { icon="./images/deer.jpg" } + * Sub-item B1 { icon="fas-file-code" } + * Sub-item B2 + * Sub-item B3 + * Sub-sub-item B3.1 { icon="./images/deer.jpg" i-width="50px" } + * Sub-sub-item B3.2 + * Sub-sub-sub-item B3.2.1 + * Sub-item B4 + +1. Testing with various attributes +* Item A { icon="glyphicon-education" i-size="20px" i-class="text-primary" } +* Item B { icon="./images/deer.jpg" i-width="200px" i-height="100px" i-class="text-warning" } + * Sub-item B1 { icon="fas-file-code" i-size="30px" } + * Sub-item B2 { i-class="text-success" } + * Sub-item B3 + * Sub-sub-item B3.1 { icon="./images/deer.jpg" i-width="50px" i-height="50px" } + * Sub-sub-item B3.2 + * Sub-sub-sub-item B3.2.1 { i-class="text-danger" } + * Sub-item B4 + +1. Mixing basic and customized lists +* Item A +* Item B + * Sub-item B1 {icon="fas-file-code" i-size="20px" i-class="text-success"} + * Sub-item B2 + * Sub-item B3 + * Sub-sub-item B3.1 {icon="glyphicon-education" i-size="30px" i-class="text-danger"} + * Sub-sub-item B3.2 + * Sub-sub-sub-item B3.2.1 {icon="./images/deer.jpg" i-width="200px" i-height="100px" i-class="text-warning"} + * Sub-item B4 + +1. Reverse mixing basic and customized lists +* Item A {icon="glyphicon-education" i-size="20px" i-class="text-primary"} +* Item B + * Sub-item B1 + * Sub-item B2 + * Sub-item B3 + * Sub-sub-item B3.1 + * Sub-sub-item B3.2 + * Sub-sub-sub-item B3.2.1 + * Sub-item B4 + +1. Every second list item customized +* Item A {icon="glyphicon-education" i-size="20px" i-class="text-primary"} +* Item B + * Sub-item B1 {icon="fas-file-code" i-size="30px" i-class="text-success"} + * Sub-item B2 + * Sub-item B3 {icon="./images/deer.jpg" i-width="200px" i-height="100px" i-class="text-warning"} + * Sub-item B4 diff --git a/packages/core/src/html/CustomListIconProcessor.ts b/packages/core/src/html/CustomListIconProcessor.ts new file mode 100644 index 0000000000..db3c3d45b9 --- /dev/null +++ b/packages/core/src/html/CustomListIconProcessor.ts @@ -0,0 +1,182 @@ +import cheerio from 'cheerio'; +import { MbNode, NodeOrText } from '../utils/node'; + +const { processIconString } = require('../lib/markdown-it/plugins/markdown-it-icons'); +const emojiDictionary = require('../lib/markdown-it/patches/markdown-it-emoji-fixed'); + +interface EmojiData { + [key: string]: string; +} + +const emojiData = emojiDictionary as unknown as EmojiData; + +const ICON_ATTRIBUTES = ['icon', 'i-width', 'i-height', 'i-size', 'i-class']; + +interface IconAttributes { + icon?: string; + className?: string; + size?: string; + width?: string; + height?: string; +} + +type IconAttributeDetail = { + isFirst: boolean; + iconAttrs: IconAttributes | null; +}; + +function classifyIcon(icon: string) { + const isEmoji = Object.prototype.hasOwnProperty.call(emojiData, icon); + + return { + isEmoji, + unicodeEmoji: isEmoji + ? emojiData[icon] + : undefined, + }; +} + +function createIconSpan(iconAttrs: IconAttributes): cheerio.Cheerio { + const { + isEmoji, + unicodeEmoji, + } = classifyIcon(iconAttrs.icon!); + + let spanContent; + if (isEmoji) { + spanContent = ``; + } else { + spanContent = processIconString(iconAttrs.icon); + } + + let spanNode; + if (spanContent === null) { + const img = cheerio(`Icon`) + .css({ width: iconAttrs.width, height: iconAttrs.height, display: 'inline-block' }) + .addClass(iconAttrs.className || ''); + img.append('\u200B'); + + spanContent = cheerio('').append(img).css({ + 'padding-bottom': '0.3em', + 'padding-top': '0.3em', + }); + spanNode = cheerio(spanContent).css({ 'font-size': 'unset', 'min-width': '16px' }); + } else { + spanNode = cheerio(spanContent).css({ 'font-size': 'unset', 'min-width': '16px' }); + spanNode = spanNode.css({ 'font-size': iconAttrs.size }).addClass(iconAttrs.className || ''); + } + // Add invisible character to avoid the element from being empty + spanNode.append('\u200B'); + return spanNode.css({ + 'line-height': 'unset', + 'margin-inline-end': '0.35em', + 'align-self': 'flex-start', + 'flex-shrink': '0', + }); +} + +function updateNodeStyle(node: NodeOrText) { + const nodeCheerio = cheerio(node); + + nodeCheerio.css({ + 'list-style-type': 'none', + 'padding-inline-start': '0px', + }); +} + +// If an item has a specified icon, that icon will be used for it and for subsequent +// items at that level to prevent duplication of icons attribute declarations. +const getIconAttributes = (node: MbNode, iconAttrsSoFar?: IconAttributes): +IconAttributes | null => { + if (iconAttrsSoFar?.icon === undefined && node.attribs.icon === undefined) { + return null; + } + + return { + icon: node.attribs.icon !== undefined ? node.attribs.icon : iconAttrsSoFar?.icon, + width: node.attribs['i-width'] !== undefined ? node.attribs['i-width'] : iconAttrsSoFar?.width, + height: node.attribs['i-height'] !== undefined ? node.attribs['i-height'] : iconAttrsSoFar?.height, + size: node.attribs['i-size'] !== undefined ? node.attribs['i-size'] : iconAttrsSoFar?.size, + className: node.attribs['i-class'] !== undefined ? node.attribs['i-class'] : iconAttrsSoFar?.className, + }; +}; + +const deleteAttributes = (node: MbNode, attributes: string[]) => { + attributes.forEach((attr) => { + delete node.attribs[attr]; + }); +}; + +function updateLi(node: MbNode, iconAttributes: IconAttributes) { + if ( + iconAttributes.icon === undefined + ) return; + const curLiIcon = getIconAttributes(node, iconAttributes); + + deleteAttributes(node, ICON_ATTRIBUTES); + + // Create a new div and span + const div = cheerio('
    '); + const iconSpan = createIconSpan(curLiIcon!); + + div.append(cheerio(node.children).remove()); + + // Append iconSpan and div to the child + cheerio(node).append(iconSpan); + cheerio(node).append(div); + + cheerio(node).css({ + display: 'flex', + }); +} + +// This function ensures the first item at that level must also be customized. +// If not, the list will be invalidated and default bullets will be used. +// This is to prevent unintentional mixing of standard and customized lists. +// See https://github.com/MarkBind/markbind/pull/2316#discussion_r1255364486 for more details. +function handleLiNode(node: MbNode, iconAttrValue: IconAttributeDetail) { + if (iconAttrValue.isFirst) { + iconAttrValue.iconAttrs = getIconAttributes(node); + iconAttrValue.isFirst = false; + } else if (iconAttrValue.iconAttrs) { + iconAttrValue.iconAttrs = getIconAttributes(node, iconAttrValue.iconAttrs); + } + updateLi(node, iconAttrValue.iconAttrs ?? {}); +} + +export function processUlNode(node: NodeOrText) { + const nodeAsMbNode = node as MbNode; + if (nodeAsMbNode.attribs.isIconListProcessed === 'true') { + delete nodeAsMbNode.attribs.isIconListProcessed; + return; + } + + const iconAttrs: IconAttributeDetail[] = []; + function dfs(currentNode: NodeOrText, level: number) { + if (!iconAttrs[level]) { + iconAttrs[level] = { isFirst: true, iconAttrs: null }; + } + + const ulNode = currentNode as MbNode; + const liNodes = ulNode.children.filter(child => child.name === 'li'); + + liNodes.forEach((liNode) => { + const ulChildren = liNode.children?.filter(child => child.name === 'ul'); + handleLiNode(liNode as MbNode, iconAttrs[level]); + + ulChildren?.forEach((ulChildNode) => { + // Traverse the children if any + dfs(ulChildNode, level + 1); + + // Insert an `isIconListProcessed` flag attribute to the node. + if (ulChildNode.attribs) { + ulChildNode.attribs.isIconListProcessed = 'true'; + } + }); + }); + if (iconAttrs[level].iconAttrs !== null) { + updateNodeStyle(ulNode); + } + } + dfs(node, 0); +} diff --git a/packages/core/src/html/NodeProcessor.ts b/packages/core/src/html/NodeProcessor.ts index 9158279838..80fef5eb7b 100644 --- a/packages/core/src/html/NodeProcessor.ts +++ b/packages/core/src/html/NodeProcessor.ts @@ -27,6 +27,7 @@ import { highlightCodeBlock, setCodeLineNumbers } from './codeblockProcessor'; import { setHeadingId, assignPanelId } from './headerProcessor'; import { FootnoteProcessor } from './FootnoteProcessor'; import { MbNode, NodeOrText, TextElement } from '../utils/node'; +import { processUlNode } from './CustomListIconProcessor'; const fm = require('fastmatter'); @@ -195,6 +196,9 @@ export class NodeProcessor { case 'question': this.mdAttributeRenderer.processQuestion(node); break; + case 'ul': + processUlNode(node); + break; case 'q-option': this.mdAttributeRenderer.processQOption(node); break; diff --git a/packages/core/src/lib/markdown-it/index.ts b/packages/core/src/lib/markdown-it/index.ts index fe872a410d..6cebb78084 100644 --- a/packages/core/src/lib/markdown-it/index.ts +++ b/packages/core/src/lib/markdown-it/index.ts @@ -36,7 +36,7 @@ markdownIt.use(require('markdown-it-mark')) .use(require('markdown-it-attrs')) .use(require('./plugins/markdown-it-radio-button')) .use(require('./plugins/markdown-it-block-embed')) - .use(require('./plugins/markdown-it-icons')) + .use(require('./plugins/markdown-it-icons').markdownItPlugin) .use(require('./plugins/markdown-it-footnotes')) .use(require('./plugins/markdown-it-center-text')) .use(require('./plugins/markdown-it-colour-text')) diff --git a/packages/core/src/lib/markdown-it/patches/markdown-it-emoji-fixed.js b/packages/core/src/lib/markdown-it/patches/markdown-it-emoji-fixed.js index 9d43c39ef7..c963c4f3ff 100644 --- a/packages/core/src/lib/markdown-it/patches/markdown-it-emoji-fixed.js +++ b/packages/core/src/lib/markdown-it/patches/markdown-it-emoji-fixed.js @@ -14,4 +14,4 @@ emojiData['seven'] = '7️⃣'; emojiData['eight'] = '8️⃣'; emojiData['nine'] = '9️⃣'; -module.exports = emojiData; +module.exports = emojiData; \ No newline at end of file diff --git a/packages/core/src/lib/markdown-it/plugins/markdown-it-icons.ts b/packages/core/src/lib/markdown-it/plugins/markdown-it-icons.ts index 5ac1f143da..96e756d142 100644 --- a/packages/core/src/lib/markdown-it/plugins/markdown-it-icons.ts +++ b/packages/core/src/lib/markdown-it/plugins/markdown-it-icons.ts @@ -1,68 +1,110 @@ -import octicons, { IconName } from '@primer/octicons'; -import cheerio from 'cheerio'; - +// import the necessary packages +const octicons = require('@primer/octicons'); +const cheerio = require('cheerio'); const markdownItRegExp = require('markdown-it-regexp'); +// regular expression to match the icon patterns +const ICON_REGEXP + = /:(fa[brs]|fa-brands|fa-solid|glyphicon|octicon|octiconlight|mi[forst])-([a-z-]+)~?([a-z-]+)?:/; + +// function to get the octicon icons function getOcticonIcon(iconName: string) { - return octicons[iconName as IconName] ?? null; + return octicons[iconName] ?? null; } -const ICON_REGEXP - = /:(fa[brs]|fa-brands|fa-solid|glyphicon|octicon|octiconlight|mi[forst])-([a-z-]+)~?([a-z-]+)?:/; +// handler function for glyphicon icons +const handleGlyphicon = (iconFontName: string) => + ``; -export = markdownItRegExp( - ICON_REGEXP, - (match: string[]) => { - const iconFontType = match[1]; - const iconFontName = match[2]; - const iconClass = match[3]; +// handler function for octicon icons +const handleOcticon = (iconFontName: string, iconClass?: string) => { + const octiconIcon = getOcticonIcon(iconFontName); + // ensure octicons are valid + if (octiconIcon === null) { + return ''; + } + return iconClass ? octiconIcon.toSVG({ class: iconClass }) : octiconIcon.toSVG(); +}; + +// handler function for light octicon icons +const handleOcticonLight = (iconFontName: string, iconClass?: string) => { + const octiconIcon = getOcticonIcon(iconFontName); + // ensure octicons are valid + if (octiconIcon === null) { + return ''; + } + const octiconIconHtml = iconClass ? octiconIcon.toSVG({ class: iconClass }) : octiconIcon.toSVG(); + const $ = cheerio.load(octiconIconHtml); + $('svg').attr('style', 'color: #fff'); + return $.html(); +}; + +// handler function for material icons +const handleMaterialIcon = (iconFontType: string, iconFontName: string) => { + let materialIconsClass = 'material-icons'; + switch (iconFontType) { + case 'mio': + materialIconsClass += '-outlined'; + break; + case 'mir': + materialIconsClass += '-round'; + break; + case 'mis': + materialIconsClass += '-sharp'; + break; + case 'mit': + materialIconsClass += '-two-tone'; + break; + default: + // .material-icons generates 'Filled' style icons; hence, no suffix is needed for 'mif'. + } + // Use .align-middle by default to vertically-align the icon with its surrounding text (if any). + // Also, replace dashes (-) with underscores (_) to format the icon name properly. + return ``; +}; - if (iconFontType === 'glyphicon') { - return ``; - } else if (iconFontType === 'octicon') { - const octiconIcon = getOcticonIcon(iconFontName); - // ensure octicons are valid - if (octiconIcon === null) { - return ''; - } - return iconClass - ? octiconIcon.toSVG({ class: iconClass }) - : octiconIcon.toSVG(); - } else if (iconFontType === 'octiconlight') { - const octiconIcon = getOcticonIcon(iconFontName); - // ensure octicons are valid - if (octiconIcon === null) { - return ''; - } - const octiconIconHtml = iconClass - ? octiconIcon.toSVG({ class: iconClass }) - : octiconIcon.toSVG(); - const $ = cheerio.load(octiconIconHtml); - $('svg').attr('style', 'color: #fff'); - return $.html(); - } else if (iconFontType.startsWith('mi')) { - let materialIconsClass = 'material-icons'; - switch (iconFontType) { - case 'mio': - materialIconsClass += '-outlined'; - break; - case 'mir': - materialIconsClass += '-round'; - break; - case 'mis': - materialIconsClass += '-sharp'; - break; - case 'mit': - materialIconsClass += '-two-tone'; - break; - default: - // .material-icons generates 'Filled' style icons; hence, no suffix is needed for 'mif'. - } - // Use .align-middle by default to vertically-align the icon with its surrounding text (if any). - // Also, replace dashes (-) with underscores (_) to format the icon name properly. - return ``; - } // If icon is a Font Awesome icon - return ``; - }, +// handler function for font awesome icons +const handleFontAwesome = (iconFontType: string, iconFontName: string) => + ``; + +// function to get the respective icon html based on the icon font type +const getIconHtml = (match: string[]) => { + const iconFontType = match[1]; + const iconFontName = match[2]; + const iconClass = match[3]; + + if (iconFontType === 'glyphicon') { + return handleGlyphicon(iconFontName); + } else if (iconFontType === 'octicon') { + return handleOcticon(iconFontName, iconClass); + } else if (iconFontType === 'octiconlight') { + return handleOcticonLight(iconFontName, iconClass); + } else if (iconFontType.startsWith('mi')) { + return handleMaterialIcon(iconFontType, iconFontName); + } + return handleFontAwesome(iconFontType, iconFontName); +}; + +// function to process the icon string and get the icon html +const processIconString = (iconStr: string) => { + let icon = iconStr; + + if (!iconStr.startsWith(':') && !iconStr.endsWith(':')) { + icon = `:${iconStr}:`; + } + + const match = icon.match(ICON_REGEXP); + return match ? getIconHtml(match) : null; +}; + +// create a markdown-it plugin to process the icon strings in the markdown +const markdownItPlugin = markdownItRegExp( + ICON_REGEXP, + (match: string[]) => getIconHtml(match), ); + +module.exports = { + markdownItPlugin, + processIconString, +}; From 9c5db5fcf58d345c968b0fb127a0473a4c5f8cc4 Mon Sep 17 00:00:00 2001 From: lesterong <84223259+lesterong@users.noreply.github.com> Date: Tue, 15 Aug 2023 08:00:55 +0800 Subject: [PATCH 3/3] Setup Codecov using GitHub actions (#2348) --- .github/workflows/ci.yml | 4 ++++ .stylelintignore | 2 ++ README.md | 1 + packages/cli/jest.config.js | 1 + packages/core/jest.config.js | 1 + 5 files changed, 9 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 18e34e8f0f..8ef8f13e94 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,6 +32,10 @@ jobs: distribution: 'temurin' - run: npm run setup - run: npm run test + - name: Upload coverage report to Codecov + uses: codecov/codecov-action@v3 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} check-docs: runs-on: ubuntu-latest steps: diff --git a/.stylelintignore b/.stylelintignore index e3ccae354a..46cb239e18 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -2,3 +2,5 @@ **/_site/**/*.css packages/cli/test/functional/**/expected/**/*.css packages/vue-components/**/*.css +packages/cli/coverage/**/*.css +packages/core/coverage/**/*.css diff --git a/README.md b/README.md index 80a9f62ea2..512b83892e 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![CI](https://github.com/MarkBind/markbind/actions/workflows/ci.yml/badge.svg)](https://github.com/MarkBind/markbind/actions/workflows/ci.yml) [![npm](https://img.shields.io/npm/v/markbind-cli)](https://www.npmjs.com/package/markbind-cli) [![Netlify Status](https://api.netlify.com/api/v1/badges/9a8095bf-b582-4dce-9631-98c5754ba199/deploy-status)](https://app.netlify.com/sites/markbind-master/deploys) +[![codecov](https://codecov.io/gh/MarkBind/markbind/branch/master/graph/badge.svg?token=AfVbuV77yg)](https://codecov.io/gh/MarkBind/markbind) **A tool for generating static websites from Markdown-like syntax**. Optimized for content-heavy instructional websites, e.g. course websites, tutorials, project/product documentation, textbooks. diff --git a/packages/cli/jest.config.js b/packages/cli/jest.config.js index 01de020e2f..18512506c5 100644 --- a/packages/cli/jest.config.js +++ b/packages/cli/jest.config.js @@ -1,3 +1,4 @@ module.exports = { + collectCoverage: true, testPathIgnorePatterns: ['test/functional/'], }; diff --git a/packages/core/jest.config.js b/packages/core/jest.config.js index 3521422aeb..c7a239ea33 100644 --- a/packages/core/jest.config.js +++ b/packages/core/jest.config.js @@ -3,6 +3,7 @@ module.exports = { verbose: true, preset: 'ts-jest/presets/js-with-babel', testEnvironment: 'node', + collectCoverage: true, // Disable type-checking for test files until we have fully adapted to TypeScript. // Temporarily remove the below lines if you need to type-check the test files // as you run the tests.