From ef502dbf57d5b798ec535c4d4a62f62b5dd2588f Mon Sep 17 00:00:00 2001 From: Wang Yiwen <121547057+yiwen101@users.noreply.github.com> Date: Sun, 25 Feb 2024 19:48:43 +0800 Subject: [PATCH] Fix external styles and script not hoisted by externals (#2414) Also add warning in documentation that styles in hoisted external will also affect the rest of the page --- docs/userGuide/syntax/includes.md | 2 + docs/userGuide/syntax/panels.md | 11 + .../test_site/expected/siteData.json | 9 + .../PanelSourceContainsScript._include_.html | 6 + .../expected/testSourceContainScript.html | 289 ++++++++++++++++++ ...testSourceContainScript.page-vue-render.js | 16 + .../cli/test/functional/test_site/site.json | 4 + .../testPanels/PanelSourceContainsScript.md | 13 + .../test_site/testSourceContainScript.md | 1 + packages/core/src/External/External.ts | 10 +- packages/core/src/External/ExternalManager.ts | 6 +- packages/core/src/Page/index.ts | 4 +- packages/core/src/html/NodeProcessor.ts | 2 +- .../src/html/scriptAndStyleTagProcessor.ts | 7 +- 14 files changed, 369 insertions(+), 11 deletions(-) create mode 100644 packages/cli/test/functional/test_site/expected/testPanels/PanelSourceContainsScript._include_.html create mode 100644 packages/cli/test/functional/test_site/expected/testSourceContainScript.html create mode 100644 packages/cli/test/functional/test_site/expected/testSourceContainScript.page-vue-render.js create mode 100644 packages/cli/test/functional/test_site/testPanels/PanelSourceContainsScript.md create mode 100644 packages/cli/test/functional/test_site/testSourceContainScript.md diff --git a/docs/userGuide/syntax/includes.md b/docs/userGuide/syntax/includes.md index 43c41ab6f3..bbb681aa33 100644 --- a/docs/userGuide/syntax/includes.md +++ b/docs/userGuide/syntax/includes.md @@ -55,6 +55,8 @@ When setting the `id` of a fragment, be careful not to clash with heading anchor + + The `` mechanism can be used inside any MarkBind source file (even inside the _frontmatter_ section) but it will not work inside some _special_ files such as the `_markbind/variables.md`. diff --git a/docs/userGuide/syntax/panels.md b/docs/userGuide/syntax/panels.md index 485f52a67e..96638d3c0f 100644 --- a/docs/userGuide/syntax/panels.md +++ b/docs/userGuide/syntax/panels.md @@ -145,6 +145,17 @@ plain text ... +
+ + +Importing external resources that contains `script` or `styles` can inadvertently take global effects on your MarkBind website. Due to hoisting during processing, imported scripts and stylesheets affect the entire page. This could potentially alter its appearance and behavior beyond the intended scope. + +For example, if a CSS file imported via such means styles headings to be red, this change will be reflected page-wide. + +To safeguard against unintended consequences, consider directly incorporating the code or customizing styles to target specific elements or classes not used universally. This approach grants more precise control over your website's presentation and reduces the risk of unexpected changes. + +
+ **If `popup-url` attribute is provided, a popup button will be shown. If clicked, it opens the specified url in a new window.** diff --git a/packages/cli/test/functional/test_site/expected/siteData.json b/packages/cli/test/functional/test_site/expected/siteData.json index fb517276f5..567c2ddca7 100644 --- a/packages/cli/test/functional/test_site/expected/siteData.json +++ b/packages/cli/test/functional/test_site/expected/siteData.json @@ -453,6 +453,15 @@ "title": "glyphicon & octicon icon in page, only glyphicon & octicon stylesheets should be loaded", "headings": {}, "headingKeywords": {} + }, + { + "src": "testSourceContainScript.md", + "title": "Test: If source contains script or css, when included, the script or css should be included", + "headings": { + "panel-with-src-that-contains-css-and-script-header": "Panel with src that contains css and script header", + "h1-text": "\n\n\n h1 text\n \n" + }, + "headingKeywords": {} } ] } diff --git a/packages/cli/test/functional/test_site/expected/testPanels/PanelSourceContainsScript._include_.html b/packages/cli/test/functional/test_site/expected/testPanels/PanelSourceContainsScript._include_.html new file mode 100644 index 0000000000..8807a80c64 --- /dev/null +++ b/packages/cli/test/functional/test_site/expected/testPanels/PanelSourceContainsScript._include_.html @@ -0,0 +1,6 @@ +

+ + + h1 text + +

\ No newline at end of file diff --git a/packages/cli/test/functional/test_site/expected/testSourceContainScript.html b/packages/cli/test/functional/test_site/expected/testSourceContainScript.html new file mode 100644 index 0000000000..5101e884eb --- /dev/null +++ b/packages/cli/test/functional/test_site/expected/testSourceContainScript.html @@ -0,0 +1,289 @@ + + + + + + + + + + + + + Test: If source contains script or css, when included, the script or css should be included + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + +
  • Open Bugs
  • +
    +
    +
    + Test Jumbotron
    +
    +
    +
    +

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

    +
    +
    + + + + +
    + + +
    + + + + +
    +
    +
    +

    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/testSourceContainScript.page-vue-render.js b/packages/cli/test/functional/test_site/expected/testSourceContainScript.page-vue-render.js new file mode 100644 index 0000000000..686d1b1d99 --- /dev/null +++ b/packages/cli/test/functional/test_site/expected/testSourceContainScript.page-vue-render.js @@ -0,0 +1,16 @@ + + 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(" "),_c('panel',{attrs:{"src":"/test_site/testPanels/PanelSourceContainsScript._include_.html","expanded":"","panelId":"panel-with-src-that-contains-css-and-script-header"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"panel-with-src-that-contains-css-and-script-header"}},[_v("Panel with src that contains css and script header"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#panel-with-src-that-contains-css-and-script-header","onclick":"event.stopPropagation()"}})])]},proxy:true}])})],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(2)])} +}; + 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('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 18710cd1f2..bde8c35414 100644 --- a/packages/cli/test/functional/test_site/site.json +++ b/packages/cli/test/functional/test_site/site.json @@ -193,6 +193,10 @@ { "src": "testIconsInSiteLayout.md", "title": "glyphicon & octicon icon in page, only glyphicon & octicon stylesheets should be loaded" + }, + { + "src": "testSourceContainScript.md", + "title": "Test: If source contains script or css, when included, the script or css should be included" } ], "pagesExclude": ["**/*-fragment.md"], diff --git a/packages/cli/test/functional/test_site/testPanels/PanelSourceContainsScript.md b/packages/cli/test/functional/test_site/testPanels/PanelSourceContainsScript.md new file mode 100644 index 0000000000..79a933e11c --- /dev/null +++ b/packages/cli/test/functional/test_site/testPanels/PanelSourceContainsScript.md @@ -0,0 +1,13 @@ +

    + + +h1 text +

    diff --git a/packages/cli/test/functional/test_site/testSourceContainScript.md b/packages/cli/test/functional/test_site/testSourceContainScript.md new file mode 100644 index 0000000000..57a2995537 --- /dev/null +++ b/packages/cli/test/functional/test_site/testSourceContainScript.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/core/src/External/External.ts b/packages/core/src/External/External.ts index e6517f109e..6dae06e282 100644 --- a/packages/core/src/External/External.ts +++ b/packages/core/src/External/External.ts @@ -16,11 +16,13 @@ export class External { externalManager: ExternalManager; sourceFilePath: string; includedFiles: Set; + userScriptsAndStyles: string[]; - constructor(em: ExternalManager, srcFilePath: string) { + constructor(em: ExternalManager, srcFilePath: string, userScriptsAndStyles: string[]) { this.externalManager = em; this.sourceFilePath = srcFilePath; this.includedFiles = new Set([srcFilePath]); + this.userScriptsAndStyles = userScriptsAndStyles; } /** @@ -42,7 +44,7 @@ export class External { const pageSources = new PageSources(); const docId = `ext-${fsUtil.removeExtension(path.basename(asIfAtFilePath))}`; const nodeProcessor = new NodeProcessor(fileConfig, pageSources, variableProcessor, - pluginManager, siteLinkManager, undefined, docId); + pluginManager, siteLinkManager, this.userScriptsAndStyles, docId); const nunjucksProcessed = variableProcessor.renderWithSiteVariables(this.sourceFilePath, pageSources); const mdHtmlProcessed = await nodeProcessor.process(this.sourceFilePath, nunjucksProcessed, @@ -57,7 +59,9 @@ export class External { pageSources.addAllToSet(this.includedFiles); - await this.externalManager.generateDependencies(pageSources.getDynamicIncludeSrc(), this.includedFiles); + await this.externalManager.generateDependencies(pageSources.getDynamicIncludeSrc(), + this.includedFiles, + this.userScriptsAndStyles); return this; } diff --git a/packages/core/src/External/ExternalManager.ts b/packages/core/src/External/ExternalManager.ts index 357e66b5b6..67c06ed179 100644 --- a/packages/core/src/External/ExternalManager.ts +++ b/packages/core/src/External/ExternalManager.ts @@ -42,7 +42,9 @@ export class ExternalManager { * @param {Set} includedFiles * @return {Promise} */ - async generateDependencies(dependencies: DynamicSrc[], includedFiles: Set) { + async generateDependencies(dependencies: DynamicSrc[], + includedFiles: Set, + userScriptsAndStyles: string[]) { const resolvingExternals: Promise[] = []; _.uniqBy(dependencies, d => d.asIfTo).forEach((src) => { @@ -55,7 +57,7 @@ export class ExternalManager { const resultPathWithExternalExt = fsUtil.setExtension(resultPath, '._include_.html'); if (!(resultPathWithExternalExt in this.builtFiles)) { - const external = new External(this, src.to); + const external = new External(this, src.to, userScriptsAndStyles); this.builtFiles[resultPathWithExternalExt] = external.resolveDependency(src.asIfTo, resultPathWithExternalExt, this.config); diff --git a/packages/core/src/Page/index.ts b/packages/core/src/Page/index.ts index c6b8daaca4..bca627d137 100644 --- a/packages/core/src/Page/index.ts +++ b/packages/core/src/Page/index.ts @@ -544,7 +544,9 @@ export class Page { }; pageSources.addAllToSet(this.includedFiles); - await externalManager.generateDependencies(pageSources.getDynamicIncludeSrc(), this.includedFiles); + await externalManager.generateDependencies(pageSources.getDynamicIncludeSrc(), + this.includedFiles, + this.pageUserScriptsAndStyles); this.collectHeadingsAndKeywords(pageContent); diff --git a/packages/core/src/html/NodeProcessor.ts b/packages/core/src/html/NodeProcessor.ts index db688f507a..b933a28b42 100644 --- a/packages/core/src/html/NodeProcessor.ts +++ b/packages/core/src/html/NodeProcessor.ts @@ -78,7 +78,7 @@ export class NodeProcessor { private variableProcessor: VariableProcessor, private pluginManager: PluginManager, private siteLinkManager: SiteLinkManager, - private userScriptsAndStyles: string[] | undefined, + private userScriptsAndStyles: string[], docId = '', ) { this.markdownProcessor = new MarkdownProcessor(docId); diff --git a/packages/core/src/html/scriptAndStyleTagProcessor.ts b/packages/core/src/html/scriptAndStyleTagProcessor.ts index e57e6ea70a..899c390b11 100644 --- a/packages/core/src/html/scriptAndStyleTagProcessor.ts +++ b/packages/core/src/html/scriptAndStyleTagProcessor.ts @@ -11,13 +11,12 @@ import { DomElement } from 'htmlparser2'; * @param node from the dom traversal * @param userScriptsAndStyles to store scripts and style tags for hoisting */ -export function processScriptAndStyleTag(node: DomElement, userScriptsAndStyles: string[] | undefined) { +export function processScriptAndStyleTag(node: DomElement, userScriptsAndStyles: string[]) { // Do not process script/style tags that are meant to be inserted in head/bottom of HTML const isHeadOrBottom = node.parent && (node.parent.name === 'head-top' || node.parent.name === 'head-bottom' || node.parent.name === 'script-bottom'); - // Do not process script/style tags that are from External - const isExternal = userScriptsAndStyles === undefined; - if (isHeadOrBottom || isExternal) { + + if (isHeadOrBottom) { return; }