Configure nunjucks to use working directory - #684

Closed
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir
Closed

Configure nunjucks to use working directory#684
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir

Conversation

@jamos-tay

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request? (put "X" next to an item, remove the rest)

• [X] Bug fix

Fixes#678 (I think)

What is the rationale for this request?

I couldn't run markbind serve docs to serve the docs folder as it was giving me errors:

C:\Users\Jamos\Desktop\Markbind>markbind serve docs

image

I had to run it from inside the folder to work:

C:\Users\Jamos\Desktop\Markbind\docs>markbind serve

This is due to this line from #668, nunjucks tries to read the file path from the current working directory which differs based on where the command is executed:

{% from "userGuide/fullSyntaxReference.md" import syntax_topics as topics %}

What changes did you make? (Give an overview)

Configure nunjucks to use the rootpath so sites can be served outside their working directory.

@damithc

Copy link
Copy Markdown
Contributor

This is a breaking change, right? Existing nunjucks code specifies import paths relative to the project root.

@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Feb 11, 2019

Copy link
Copy Markdown
Contributor

Proposal:
To handle the sub-sites, we can use the directory of the nearest site.json file (since a sub-site should have one) as the nunjucks.configure([directory]) or parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}).

Have not tested if it works but maybe a step in the right direction?

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}

This could be quite expensive, perhaps we can pass an additional argument for the site's root?

Alternatively, we could render the string wrt to the current working file. For most of the calls this is saved in context.cwf. This is different from nunjucks default behaviour though.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm, what are the edge cases to consider? Haven't really tested any other cases, but it managed to fix the docs problem

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

Consider a sub site where it references a file (say variables.md) with nunjucks relative to its own root folder. If built on its own it will be fine.

However, If the sub site is recursively built by a outer site, it will not be able to find variables.md as nunjucks is looking for it wrt to the outer site's root folder.

@acjh

acjh commented Feb 12, 2019

Copy link
Copy Markdown
Contributor

We should handle that; we already do for {{ baseUrl }}.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hi, reviving this PR.

@nicholaschuayunzhi I tested it, and I think it seems to be working? Here are my steps:

Site/
subsite/
_markbind/
variables.md <= Variable added here
_site/
index.md <= References variable
_site/
_subsite/
index.html <= Check this
_markbind/
index.md
  • Create an empty folder named Site, run markbind init
  • Create a subsite folder, run markbind init
  • Create a variable in the subsite project and have index.md reference it
  • Run markbind serve inside the Site folder
  • Check the index.html of the subsite that is built in the Site's _site folder

The variable seems to be loaded correctly.

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 18, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay, did you access the file via nunjucks, eg:
{% from '_markbind/variables.md' import variable %} ? This should be in the subsite and you build the site from the root site.

@jamos-tay
jamos-tayforce-pushed the conf-nunjucks-working-dir branch from 4017f07 to 7de4c4eCompareMarch 19, 2019 06:41
@jamos-tay

jamos-tay commented Mar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

@nicholaschuayunzhi I've changed it to concat the baseUrl, the following works for me:

(Same directory structure as before)

subsite/_markbind/variables.md

{% set n = 5 %}

subsite/index.md

{% from "_markbind/variables.md" import n %}
{{ n }}

Running markbind serve in the subsite folder compiles _site/index.html correctly, 5 is displayed
Running markbind serve in the site folder compiles _site/subsite/index.html correctly, 5 is displayed
Running markbind serve docs in the markbind folder serves docs correctly

Is this correct?

Comment threadsrc/Page.js
return $.html();
}

function Page(pageConfig) {

@jamos-tayjamos-tayMar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Had to move this down for eslint because it references calculateNewBaseUrl, only lines 208-210 are added

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 19, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay was testing your case and it works which is great.

However, when you create an "outer" root_variables.md, and reference it in index.md from the root site, it won't work.

This is because when we will configure nunjucks for the sub site, we haven't called nunjucks#renderString for the outer site variables. So when nunjucks tries to render a variable in the root site we get this error: Error: template not found: root_variables.md. (our nunjucks path is already the sub site)

@damithc

Copy link
Copy Markdown
Contributor

@openorclose see if this PR can be salvaged as some work has been done already. It would be a pity to let that go to waste, if it can be helped.

@le0tanle0tan added the pr.BugFix 🐛 Fixes correct a programming error/assumption label Apr 22, 2020
@ang-zeyu

Copy link
Copy Markdown
Contributor

Closing this per #931 (comment)

@ang-zeyuang-zeyu closed this Jun 7, 2020
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr.BugFix 🐛Fixes correct a programming error/assumption

Projects

None yet

Development

Successfully merging this pull request may close these issues.

nunjucks syntax does not work if site is built outside of site root folder

7 participants

@jamos-tay@damithc@Chng-Zhi-Xuan@nicholaschuayunzhi@acjh@ang-zeyu@le0tan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Configure nunjucks to use working directory - #684

Closed
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir
Closed

Configure nunjucks to use working directory#684
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir

Conversation

@jamos-tay

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request? (put "X" next to an item, remove the rest)

• [X] Bug fix

Fixes#678 (I think)

What is the rationale for this request?

I couldn't run markbind serve docs to serve the docs folder as it was giving me errors:

C:\Users\Jamos\Desktop\Markbind>markbind serve docs

image

I had to run it from inside the folder to work:

C:\Users\Jamos\Desktop\Markbind\docs>markbind serve

This is due to this line from #668, nunjucks tries to read the file path from the current working directory which differs based on where the command is executed:

{% from "userGuide/fullSyntaxReference.md" import syntax_topics as topics %}

What changes did you make? (Give an overview)

Configure nunjucks to use the rootpath so sites can be served outside their working directory.

@damithc

Copy link
Copy Markdown
Contributor

This is a breaking change, right? Existing nunjucks code specifies import paths relative to the project root.

@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Feb 11, 2019

Copy link
Copy Markdown
Contributor

Proposal:
To handle the sub-sites, we can use the directory of the nearest site.json file (since a sub-site should have one) as the nunjucks.configure([directory]) or parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}).

Have not tested if it works but maybe a step in the right direction?

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}

This could be quite expensive, perhaps we can pass an additional argument for the site's root?

Alternatively, we could render the string wrt to the current working file. For most of the calls this is saved in context.cwf. This is different from nunjucks default behaviour though.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm, what are the edge cases to consider? Haven't really tested any other cases, but it managed to fix the docs problem

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

Consider a sub site where it references a file (say variables.md) with nunjucks relative to its own root folder. If built on its own it will be fine.

However, If the sub site is recursively built by a outer site, it will not be able to find variables.md as nunjucks is looking for it wrt to the outer site's root folder.

@acjh

acjh commented Feb 12, 2019

Copy link
Copy Markdown
Contributor

We should handle that; we already do for {{ baseUrl }}.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hi, reviving this PR.

@nicholaschuayunzhi I tested it, and I think it seems to be working? Here are my steps:

Site/
subsite/
_markbind/
variables.md <= Variable added here
_site/
index.md <= References variable
_site/
_subsite/
index.html <= Check this
_markbind/
index.md
  • Create an empty folder named Site, run markbind init
  • Create a subsite folder, run markbind init
  • Create a variable in the subsite project and have index.md reference it
  • Run markbind serve inside the Site folder
  • Check the index.html of the subsite that is built in the Site's _site folder

The variable seems to be loaded correctly.

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 18, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay, did you access the file via nunjucks, eg:
{% from '_markbind/variables.md' import variable %} ? This should be in the subsite and you build the site from the root site.

@jamos-tay
jamos-tayforce-pushed the conf-nunjucks-working-dir branch from 4017f07 to 7de4c4eCompareMarch 19, 2019 06:41
@jamos-tay

jamos-tay commented Mar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

@nicholaschuayunzhi I've changed it to concat the baseUrl, the following works for me:

(Same directory structure as before)

subsite/_markbind/variables.md

{% set n = 5 %}

subsite/index.md

{% from "_markbind/variables.md" import n %}
{{ n }}

Running markbind serve in the subsite folder compiles _site/index.html correctly, 5 is displayed
Running markbind serve in the site folder compiles _site/subsite/index.html correctly, 5 is displayed
Running markbind serve docs in the markbind folder serves docs correctly

Is this correct?

Comment threadsrc/Page.js
return $.html();
}

function Page(pageConfig) {

@jamos-tayjamos-tayMar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Had to move this down for eslint because it references calculateNewBaseUrl, only lines 208-210 are added

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 19, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay was testing your case and it works which is great.

However, when you create an "outer" root_variables.md, and reference it in index.md from the root site, it won't work.

This is because when we will configure nunjucks for the sub site, we haven't called nunjucks#renderString for the outer site variables. So when nunjucks tries to render a variable in the root site we get this error: Error: template not found: root_variables.md. (our nunjucks path is already the sub site)

@damithc

Copy link
Copy Markdown
Contributor

@openorclose see if this PR can be salvaged as some work has been done already. It would be a pity to let that go to waste, if it can be helped.

@le0tanle0tan added the pr.BugFix 🐛 Fixes correct a programming error/assumption label Apr 22, 2020
@ang-zeyu

Copy link
Copy Markdown
Contributor

Closing this per #931 (comment)

@ang-zeyuang-zeyu closed this Jun 7, 2020
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr.BugFix 🐛Fixes correct a programming error/assumption

Projects

None yet

Development

Successfully merging this pull request may close these issues.

nunjucks syntax does not work if site is built outside of site root folder

7 participants

@jamos-tay@damithc@Chng-Zhi-Xuan@nicholaschuayunzhi@acjh@ang-zeyu@le0tan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Configure nunjucks to use working directory - #684

Closed
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir
Closed

Configure nunjucks to use working directory#684
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir

Conversation

@jamos-tay

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request? (put "X" next to an item, remove the rest)

• [X] Bug fix

Fixes#678 (I think)

What is the rationale for this request?

I couldn't run markbind serve docs to serve the docs folder as it was giving me errors:

C:\Users\Jamos\Desktop\Markbind>markbind serve docs

image

I had to run it from inside the folder to work:

C:\Users\Jamos\Desktop\Markbind\docs>markbind serve

This is due to this line from #668, nunjucks tries to read the file path from the current working directory which differs based on where the command is executed:

{% from "userGuide/fullSyntaxReference.md" import syntax_topics as topics %}

What changes did you make? (Give an overview)

Configure nunjucks to use the rootpath so sites can be served outside their working directory.

@damithc

Copy link
Copy Markdown
Contributor

This is a breaking change, right? Existing nunjucks code specifies import paths relative to the project root.

@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Feb 11, 2019

Copy link
Copy Markdown
Contributor

Proposal:
To handle the sub-sites, we can use the directory of the nearest site.json file (since a sub-site should have one) as the nunjucks.configure([directory]) or parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}).

Have not tested if it works but maybe a step in the right direction?

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}

This could be quite expensive, perhaps we can pass an additional argument for the site's root?

Alternatively, we could render the string wrt to the current working file. For most of the calls this is saved in context.cwf. This is different from nunjucks default behaviour though.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm, what are the edge cases to consider? Haven't really tested any other cases, but it managed to fix the docs problem

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

Consider a sub site where it references a file (say variables.md) with nunjucks relative to its own root folder. If built on its own it will be fine.

However, If the sub site is recursively built by a outer site, it will not be able to find variables.md as nunjucks is looking for it wrt to the outer site's root folder.

@acjh

acjh commented Feb 12, 2019

Copy link
Copy Markdown
Contributor

We should handle that; we already do for {{ baseUrl }}.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hi, reviving this PR.

@nicholaschuayunzhi I tested it, and I think it seems to be working? Here are my steps:

Site/
subsite/
_markbind/
variables.md <= Variable added here
_site/
index.md <= References variable
_site/
_subsite/
index.html <= Check this
_markbind/
index.md
  • Create an empty folder named Site, run markbind init
  • Create a subsite folder, run markbind init
  • Create a variable in the subsite project and have index.md reference it
  • Run markbind serve inside the Site folder
  • Check the index.html of the subsite that is built in the Site's _site folder

The variable seems to be loaded correctly.

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 18, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay, did you access the file via nunjucks, eg:
{% from '_markbind/variables.md' import variable %} ? This should be in the subsite and you build the site from the root site.

@jamos-tay
jamos-tayforce-pushed the conf-nunjucks-working-dir branch from 4017f07 to 7de4c4eCompareMarch 19, 2019 06:41
@jamos-tay

jamos-tay commented Mar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

@nicholaschuayunzhi I've changed it to concat the baseUrl, the following works for me:

(Same directory structure as before)

subsite/_markbind/variables.md

{% set n = 5 %}

subsite/index.md

{% from "_markbind/variables.md" import n %}
{{ n }}

Running markbind serve in the subsite folder compiles _site/index.html correctly, 5 is displayed
Running markbind serve in the site folder compiles _site/subsite/index.html correctly, 5 is displayed
Running markbind serve docs in the markbind folder serves docs correctly

Is this correct?

Comment threadsrc/Page.js
return $.html();
}

function Page(pageConfig) {

@jamos-tayjamos-tayMar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Had to move this down for eslint because it references calculateNewBaseUrl, only lines 208-210 are added

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 19, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay was testing your case and it works which is great.

However, when you create an "outer" root_variables.md, and reference it in index.md from the root site, it won't work.

This is because when we will configure nunjucks for the sub site, we haven't called nunjucks#renderString for the outer site variables. So when nunjucks tries to render a variable in the root site we get this error: Error: template not found: root_variables.md. (our nunjucks path is already the sub site)

@damithc

Copy link
Copy Markdown
Contributor

@openorclose see if this PR can be salvaged as some work has been done already. It would be a pity to let that go to waste, if it can be helped.

@le0tanle0tan added the pr.BugFix 🐛 Fixes correct a programming error/assumption label Apr 22, 2020
@ang-zeyu

Copy link
Copy Markdown
Contributor

Closing this per #931 (comment)

@ang-zeyuang-zeyu closed this Jun 7, 2020
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr.BugFix 🐛Fixes correct a programming error/assumption

Projects

None yet

Development

Successfully merging this pull request may close these issues.

nunjucks syntax does not work if site is built outside of site root folder

7 participants

@jamos-tay@damithc@Chng-Zhi-Xuan@nicholaschuayunzhi@acjh@ang-zeyu@le0tan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Configure nunjucks to use working directory - #684

Closed
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir
Closed

Configure nunjucks to use working directory#684
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir

Conversation

@jamos-tay

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request? (put "X" next to an item, remove the rest)

• [X] Bug fix

Fixes#678 (I think)

What is the rationale for this request?

I couldn't run markbind serve docs to serve the docs folder as it was giving me errors:

C:\Users\Jamos\Desktop\Markbind>markbind serve docs

image

I had to run it from inside the folder to work:

C:\Users\Jamos\Desktop\Markbind\docs>markbind serve

This is due to this line from #668, nunjucks tries to read the file path from the current working directory which differs based on where the command is executed:

{% from "userGuide/fullSyntaxReference.md" import syntax_topics as topics %}

What changes did you make? (Give an overview)

Configure nunjucks to use the rootpath so sites can be served outside their working directory.

@damithc

Copy link
Copy Markdown
Contributor

This is a breaking change, right? Existing nunjucks code specifies import paths relative to the project root.

@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Feb 11, 2019

Copy link
Copy Markdown
Contributor

Proposal:
To handle the sub-sites, we can use the directory of the nearest site.json file (since a sub-site should have one) as the nunjucks.configure([directory]) or parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}).

Have not tested if it works but maybe a step in the right direction?

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}

This could be quite expensive, perhaps we can pass an additional argument for the site's root?

Alternatively, we could render the string wrt to the current working file. For most of the calls this is saved in context.cwf. This is different from nunjucks default behaviour though.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm, what are the edge cases to consider? Haven't really tested any other cases, but it managed to fix the docs problem

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

Consider a sub site where it references a file (say variables.md) with nunjucks relative to its own root folder. If built on its own it will be fine.

However, If the sub site is recursively built by a outer site, it will not be able to find variables.md as nunjucks is looking for it wrt to the outer site's root folder.

@acjh

acjh commented Feb 12, 2019

Copy link
Copy Markdown
Contributor

We should handle that; we already do for {{ baseUrl }}.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hi, reviving this PR.

@nicholaschuayunzhi I tested it, and I think it seems to be working? Here are my steps:

Site/
subsite/
_markbind/
variables.md <= Variable added here
_site/
index.md <= References variable
_site/
_subsite/
index.html <= Check this
_markbind/
index.md
  • Create an empty folder named Site, run markbind init
  • Create a subsite folder, run markbind init
  • Create a variable in the subsite project and have index.md reference it
  • Run markbind serve inside the Site folder
  • Check the index.html of the subsite that is built in the Site's _site folder

The variable seems to be loaded correctly.

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 18, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay, did you access the file via nunjucks, eg:
{% from '_markbind/variables.md' import variable %} ? This should be in the subsite and you build the site from the root site.

@jamos-tay
jamos-tayforce-pushed the conf-nunjucks-working-dir branch from 4017f07 to 7de4c4eCompareMarch 19, 2019 06:41
@jamos-tay

jamos-tay commented Mar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

@nicholaschuayunzhi I've changed it to concat the baseUrl, the following works for me:

(Same directory structure as before)

subsite/_markbind/variables.md

{% set n = 5 %}

subsite/index.md

{% from "_markbind/variables.md" import n %}
{{ n }}

Running markbind serve in the subsite folder compiles _site/index.html correctly, 5 is displayed
Running markbind serve in the site folder compiles _site/subsite/index.html correctly, 5 is displayed
Running markbind serve docs in the markbind folder serves docs correctly

Is this correct?

Comment threadsrc/Page.js
return $.html();
}

function Page(pageConfig) {

@jamos-tayjamos-tayMar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Had to move this down for eslint because it references calculateNewBaseUrl, only lines 208-210 are added

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 19, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay was testing your case and it works which is great.

However, when you create an "outer" root_variables.md, and reference it in index.md from the root site, it won't work.

This is because when we will configure nunjucks for the sub site, we haven't called nunjucks#renderString for the outer site variables. So when nunjucks tries to render a variable in the root site we get this error: Error: template not found: root_variables.md. (our nunjucks path is already the sub site)

@damithc

Copy link
Copy Markdown
Contributor

@openorclose see if this PR can be salvaged as some work has been done already. It would be a pity to let that go to waste, if it can be helped.

@le0tanle0tan added the pr.BugFix 🐛 Fixes correct a programming error/assumption label Apr 22, 2020
@ang-zeyu

Copy link
Copy Markdown
Contributor

Closing this per #931 (comment)

@ang-zeyuang-zeyu closed this Jun 7, 2020
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr.BugFix 🐛Fixes correct a programming error/assumption

Projects

None yet

Development

Successfully merging this pull request may close these issues.

nunjucks syntax does not work if site is built outside of site root folder

7 participants

@jamos-tay@damithc@Chng-Zhi-Xuan@nicholaschuayunzhi@acjh@ang-zeyu@le0tan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Configure nunjucks to use working directory - #684

Closed
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir
Closed

Configure nunjucks to use working directory#684
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir

Conversation

@jamos-tay

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request? (put "X" next to an item, remove the rest)

• [X] Bug fix

Fixes#678 (I think)

What is the rationale for this request?

I couldn't run markbind serve docs to serve the docs folder as it was giving me errors:

C:\Users\Jamos\Desktop\Markbind>markbind serve docs

image

I had to run it from inside the folder to work:

C:\Users\Jamos\Desktop\Markbind\docs>markbind serve

This is due to this line from #668, nunjucks tries to read the file path from the current working directory which differs based on where the command is executed:

{% from "userGuide/fullSyntaxReference.md" import syntax_topics as topics %}

What changes did you make? (Give an overview)

Configure nunjucks to use the rootpath so sites can be served outside their working directory.

@damithc

Copy link
Copy Markdown
Contributor

This is a breaking change, right? Existing nunjucks code specifies import paths relative to the project root.

@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Feb 11, 2019

Copy link
Copy Markdown
Contributor

Proposal:
To handle the sub-sites, we can use the directory of the nearest site.json file (since a sub-site should have one) as the nunjucks.configure([directory]) or parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}).

Have not tested if it works but maybe a step in the right direction?

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}

This could be quite expensive, perhaps we can pass an additional argument for the site's root?

Alternatively, we could render the string wrt to the current working file. For most of the calls this is saved in context.cwf. This is different from nunjucks default behaviour though.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm, what are the edge cases to consider? Haven't really tested any other cases, but it managed to fix the docs problem

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

Consider a sub site where it references a file (say variables.md) with nunjucks relative to its own root folder. If built on its own it will be fine.

However, If the sub site is recursively built by a outer site, it will not be able to find variables.md as nunjucks is looking for it wrt to the outer site's root folder.

@acjh

acjh commented Feb 12, 2019

Copy link
Copy Markdown
Contributor

We should handle that; we already do for {{ baseUrl }}.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hi, reviving this PR.

@nicholaschuayunzhi I tested it, and I think it seems to be working? Here are my steps:

Site/
subsite/
_markbind/
variables.md <= Variable added here
_site/
index.md <= References variable
_site/
_subsite/
index.html <= Check this
_markbind/
index.md
  • Create an empty folder named Site, run markbind init
  • Create a subsite folder, run markbind init
  • Create a variable in the subsite project and have index.md reference it
  • Run markbind serve inside the Site folder
  • Check the index.html of the subsite that is built in the Site's _site folder

The variable seems to be loaded correctly.

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 18, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay, did you access the file via nunjucks, eg:
{% from '_markbind/variables.md' import variable %} ? This should be in the subsite and you build the site from the root site.

@jamos-tay
jamos-tayforce-pushed the conf-nunjucks-working-dir branch from 4017f07 to 7de4c4eCompareMarch 19, 2019 06:41
@jamos-tay

jamos-tay commented Mar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

@nicholaschuayunzhi I've changed it to concat the baseUrl, the following works for me:

(Same directory structure as before)

subsite/_markbind/variables.md

{% set n = 5 %}

subsite/index.md

{% from "_markbind/variables.md" import n %}
{{ n }}

Running markbind serve in the subsite folder compiles _site/index.html correctly, 5 is displayed
Running markbind serve in the site folder compiles _site/subsite/index.html correctly, 5 is displayed
Running markbind serve docs in the markbind folder serves docs correctly

Is this correct?

Comment threadsrc/Page.js
return $.html();
}

function Page(pageConfig) {

@jamos-tayjamos-tayMar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Had to move this down for eslint because it references calculateNewBaseUrl, only lines 208-210 are added

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 19, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay was testing your case and it works which is great.

However, when you create an "outer" root_variables.md, and reference it in index.md from the root site, it won't work.

This is because when we will configure nunjucks for the sub site, we haven't called nunjucks#renderString for the outer site variables. So when nunjucks tries to render a variable in the root site we get this error: Error: template not found: root_variables.md. (our nunjucks path is already the sub site)

@damithc

Copy link
Copy Markdown
Contributor

@openorclose see if this PR can be salvaged as some work has been done already. It would be a pity to let that go to waste, if it can be helped.

@le0tanle0tan added the pr.BugFix 🐛 Fixes correct a programming error/assumption label Apr 22, 2020
@ang-zeyu

Copy link
Copy Markdown
Contributor

Closing this per #931 (comment)

@ang-zeyuang-zeyu closed this Jun 7, 2020
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr.BugFix 🐛Fixes correct a programming error/assumption

Projects

None yet

Development

Successfully merging this pull request may close these issues.

nunjucks syntax does not work if site is built outside of site root folder

7 participants

@jamos-tay@damithc@Chng-Zhi-Xuan@nicholaschuayunzhi@acjh@ang-zeyu@le0tan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Configure nunjucks to use working directory - #684

Closed
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir
Closed

Configure nunjucks to use working directory#684
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir

Conversation

@jamos-tay

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request? (put "X" next to an item, remove the rest)

• [X] Bug fix

Fixes#678 (I think)

What is the rationale for this request?

I couldn't run markbind serve docs to serve the docs folder as it was giving me errors:

C:\Users\Jamos\Desktop\Markbind>markbind serve docs

image

I had to run it from inside the folder to work:

C:\Users\Jamos\Desktop\Markbind\docs>markbind serve

This is due to this line from #668, nunjucks tries to read the file path from the current working directory which differs based on where the command is executed:

{% from "userGuide/fullSyntaxReference.md" import syntax_topics as topics %}

What changes did you make? (Give an overview)

Configure nunjucks to use the rootpath so sites can be served outside their working directory.

@damithc

Copy link
Copy Markdown
Contributor

This is a breaking change, right? Existing nunjucks code specifies import paths relative to the project root.

@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Feb 11, 2019

Copy link
Copy Markdown
Contributor

Proposal:
To handle the sub-sites, we can use the directory of the nearest site.json file (since a sub-site should have one) as the nunjucks.configure([directory]) or parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}).

Have not tested if it works but maybe a step in the right direction?

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}

This could be quite expensive, perhaps we can pass an additional argument for the site's root?

Alternatively, we could render the string wrt to the current working file. For most of the calls this is saved in context.cwf. This is different from nunjucks default behaviour though.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm, what are the edge cases to consider? Haven't really tested any other cases, but it managed to fix the docs problem

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

Consider a sub site where it references a file (say variables.md) with nunjucks relative to its own root folder. If built on its own it will be fine.

However, If the sub site is recursively built by a outer site, it will not be able to find variables.md as nunjucks is looking for it wrt to the outer site's root folder.

@acjh

acjh commented Feb 12, 2019

Copy link
Copy Markdown
Contributor

We should handle that; we already do for {{ baseUrl }}.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hi, reviving this PR.

@nicholaschuayunzhi I tested it, and I think it seems to be working? Here are my steps:

Site/
subsite/
_markbind/
variables.md <= Variable added here
_site/
index.md <= References variable
_site/
_subsite/
index.html <= Check this
_markbind/
index.md
  • Create an empty folder named Site, run markbind init
  • Create a subsite folder, run markbind init
  • Create a variable in the subsite project and have index.md reference it
  • Run markbind serve inside the Site folder
  • Check the index.html of the subsite that is built in the Site's _site folder

The variable seems to be loaded correctly.

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 18, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay, did you access the file via nunjucks, eg:
{% from '_markbind/variables.md' import variable %} ? This should be in the subsite and you build the site from the root site.

@jamos-tay
jamos-tayforce-pushed the conf-nunjucks-working-dir branch from 4017f07 to 7de4c4eCompareMarch 19, 2019 06:41
@jamos-tay

jamos-tay commented Mar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

@nicholaschuayunzhi I've changed it to concat the baseUrl, the following works for me:

(Same directory structure as before)

subsite/_markbind/variables.md

{% set n = 5 %}

subsite/index.md

{% from "_markbind/variables.md" import n %}
{{ n }}

Running markbind serve in the subsite folder compiles _site/index.html correctly, 5 is displayed
Running markbind serve in the site folder compiles _site/subsite/index.html correctly, 5 is displayed
Running markbind serve docs in the markbind folder serves docs correctly

Is this correct?

Comment threadsrc/Page.js
return $.html();
}

function Page(pageConfig) {

@jamos-tayjamos-tayMar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Had to move this down for eslint because it references calculateNewBaseUrl, only lines 208-210 are added

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 19, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay was testing your case and it works which is great.

However, when you create an "outer" root_variables.md, and reference it in index.md from the root site, it won't work.

This is because when we will configure nunjucks for the sub site, we haven't called nunjucks#renderString for the outer site variables. So when nunjucks tries to render a variable in the root site we get this error: Error: template not found: root_variables.md. (our nunjucks path is already the sub site)

@damithc

Copy link
Copy Markdown
Contributor

@openorclose see if this PR can be salvaged as some work has been done already. It would be a pity to let that go to waste, if it can be helped.

@le0tanle0tan added the pr.BugFix 🐛 Fixes correct a programming error/assumption label Apr 22, 2020
@ang-zeyu

Copy link
Copy Markdown
Contributor

Closing this per #931 (comment)

@ang-zeyuang-zeyu closed this Jun 7, 2020
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr.BugFix 🐛Fixes correct a programming error/assumption

Projects

None yet

Development

Successfully merging this pull request may close these issues.

nunjucks syntax does not work if site is built outside of site root folder

7 participants

@jamos-tay@damithc@Chng-Zhi-Xuan@nicholaschuayunzhi@acjh@ang-zeyu@le0tan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Configure nunjucks to use working directory - #684

Closed
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir
Closed

Configure nunjucks to use working directory#684
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir

Conversation

@jamos-tay

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request? (put "X" next to an item, remove the rest)

• [X] Bug fix

Fixes#678 (I think)

What is the rationale for this request?

I couldn't run markbind serve docs to serve the docs folder as it was giving me errors:

C:\Users\Jamos\Desktop\Markbind>markbind serve docs

image

I had to run it from inside the folder to work:

C:\Users\Jamos\Desktop\Markbind\docs>markbind serve

This is due to this line from #668, nunjucks tries to read the file path from the current working directory which differs based on where the command is executed:

{% from "userGuide/fullSyntaxReference.md" import syntax_topics as topics %}

What changes did you make? (Give an overview)

Configure nunjucks to use the rootpath so sites can be served outside their working directory.

@damithc

Copy link
Copy Markdown
Contributor

This is a breaking change, right? Existing nunjucks code specifies import paths relative to the project root.

@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Feb 11, 2019

Copy link
Copy Markdown
Contributor

Proposal:
To handle the sub-sites, we can use the directory of the nearest site.json file (since a sub-site should have one) as the nunjucks.configure([directory]) or parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}).

Have not tested if it works but maybe a step in the right direction?

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}

This could be quite expensive, perhaps we can pass an additional argument for the site's root?

Alternatively, we could render the string wrt to the current working file. For most of the calls this is saved in context.cwf. This is different from nunjucks default behaviour though.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm, what are the edge cases to consider? Haven't really tested any other cases, but it managed to fix the docs problem

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

Consider a sub site where it references a file (say variables.md) with nunjucks relative to its own root folder. If built on its own it will be fine.

However, If the sub site is recursively built by a outer site, it will not be able to find variables.md as nunjucks is looking for it wrt to the outer site's root folder.

@acjh

acjh commented Feb 12, 2019

Copy link
Copy Markdown
Contributor

We should handle that; we already do for {{ baseUrl }}.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hi, reviving this PR.

@nicholaschuayunzhi I tested it, and I think it seems to be working? Here are my steps:

Site/
subsite/
_markbind/
variables.md <= Variable added here
_site/
index.md <= References variable
_site/
_subsite/
index.html <= Check this
_markbind/
index.md
  • Create an empty folder named Site, run markbind init
  • Create a subsite folder, run markbind init
  • Create a variable in the subsite project and have index.md reference it
  • Run markbind serve inside the Site folder
  • Check the index.html of the subsite that is built in the Site's _site folder

The variable seems to be loaded correctly.

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 18, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay, did you access the file via nunjucks, eg:
{% from '_markbind/variables.md' import variable %} ? This should be in the subsite and you build the site from the root site.

@jamos-tay
jamos-tayforce-pushed the conf-nunjucks-working-dir branch from 4017f07 to 7de4c4eCompareMarch 19, 2019 06:41
@jamos-tay

jamos-tay commented Mar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

@nicholaschuayunzhi I've changed it to concat the baseUrl, the following works for me:

(Same directory structure as before)

subsite/_markbind/variables.md

{% set n = 5 %}

subsite/index.md

{% from "_markbind/variables.md" import n %}
{{ n }}

Running markbind serve in the subsite folder compiles _site/index.html correctly, 5 is displayed
Running markbind serve in the site folder compiles _site/subsite/index.html correctly, 5 is displayed
Running markbind serve docs in the markbind folder serves docs correctly

Is this correct?

Comment threadsrc/Page.js
return $.html();
}

function Page(pageConfig) {

@jamos-tayjamos-tayMar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Had to move this down for eslint because it references calculateNewBaseUrl, only lines 208-210 are added

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 19, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay was testing your case and it works which is great.

However, when you create an "outer" root_variables.md, and reference it in index.md from the root site, it won't work.

This is because when we will configure nunjucks for the sub site, we haven't called nunjucks#renderString for the outer site variables. So when nunjucks tries to render a variable in the root site we get this error: Error: template not found: root_variables.md. (our nunjucks path is already the sub site)

@damithc

Copy link
Copy Markdown
Contributor

@openorclose see if this PR can be salvaged as some work has been done already. It would be a pity to let that go to waste, if it can be helped.

@le0tanle0tan added the pr.BugFix 🐛 Fixes correct a programming error/assumption label Apr 22, 2020
@ang-zeyu

Copy link
Copy Markdown
Contributor

Closing this per #931 (comment)

@ang-zeyuang-zeyu closed this Jun 7, 2020
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr.BugFix 🐛Fixes correct a programming error/assumption

Projects

None yet

Development

Successfully merging this pull request may close these issues.

nunjucks syntax does not work if site is built outside of site root folder

7 participants

@jamos-tay@damithc@Chng-Zhi-Xuan@nicholaschuayunzhi@acjh@ang-zeyu@le0tan
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Configure nunjucks to use working directory - #684

Closed
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir
Closed

Configure nunjucks to use working directory#684
jamos-tay wants to merge 1 commit into
MarkBind:masterfrom
jamos-tay:conf-nunjucks-working-dir

Conversation

@jamos-tay

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request? (put "X" next to an item, remove the rest)

• [X] Bug fix

Fixes#678 (I think)

What is the rationale for this request?

I couldn't run markbind serve docs to serve the docs folder as it was giving me errors:

C:\Users\Jamos\Desktop\Markbind>markbind serve docs

image

I had to run it from inside the folder to work:

C:\Users\Jamos\Desktop\Markbind\docs>markbind serve

This is due to this line from #668, nunjucks tries to read the file path from the current working directory which differs based on where the command is executed:

{% from "userGuide/fullSyntaxReference.md" import syntax_topics as topics %}

What changes did you make? (Give an overview)

Configure nunjucks to use the rootpath so sites can be served outside their working directory.

@damithc

Copy link
Copy Markdown
Contributor

This is a breaking change, right? Existing nunjucks code specifies import paths relative to the project root.

@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Feb 11, 2019

Copy link
Copy Markdown
Contributor

Proposal:
To handle the sub-sites, we can use the directory of the nearest site.json file (since a sub-site should have one) as the nunjucks.configure([directory]) or parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}).

Have not tested if it works but maybe a step in the right direction?

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

parse the directory during explicit calls of nunjucks.renderString([string],{path: [directory]}

This could be quite expensive, perhaps we can pass an additional argument for the site's root?

Alternatively, we could render the string wrt to the current working file. For most of the calls this is saved in context.cwf. This is different from nunjucks default behaviour though.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm, what are the edge cases to consider? Haven't really tested any other cases, but it managed to fix the docs problem

@nicholaschuayunzhi

Copy link
Copy Markdown
Contributor

Consider a sub site where it references a file (say variables.md) with nunjucks relative to its own root folder. If built on its own it will be fine.

However, If the sub site is recursively built by a outer site, it will not be able to find variables.md as nunjucks is looking for it wrt to the outer site's root folder.

@acjh

acjh commented Feb 12, 2019

Copy link
Copy Markdown
Contributor

We should handle that; we already do for {{ baseUrl }}.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hi, reviving this PR.

@nicholaschuayunzhi I tested it, and I think it seems to be working? Here are my steps:

Site/
subsite/
_markbind/
variables.md <= Variable added here
_site/
index.md <= References variable
_site/
_subsite/
index.html <= Check this
_markbind/
index.md
  • Create an empty folder named Site, run markbind init
  • Create a subsite folder, run markbind init
  • Create a variable in the subsite project and have index.md reference it
  • Run markbind serve inside the Site folder
  • Check the index.html of the subsite that is built in the Site's _site folder

The variable seems to be loaded correctly.

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 18, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay, did you access the file via nunjucks, eg:
{% from '_markbind/variables.md' import variable %} ? This should be in the subsite and you build the site from the root site.

@jamos-tay
jamos-tayforce-pushed the conf-nunjucks-working-dir branch from 4017f07 to 7de4c4eCompareMarch 19, 2019 06:41
@jamos-tay

jamos-tay commented Mar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

@nicholaschuayunzhi I've changed it to concat the baseUrl, the following works for me:

(Same directory structure as before)

subsite/_markbind/variables.md

{% set n = 5 %}

subsite/index.md

{% from "_markbind/variables.md" import n %}
{{ n }}

Running markbind serve in the subsite folder compiles _site/index.html correctly, 5 is displayed
Running markbind serve in the site folder compiles _site/subsite/index.html correctly, 5 is displayed
Running markbind serve docs in the markbind folder serves docs correctly

Is this correct?

Comment threadsrc/Page.js
return $.html();
}

function Page(pageConfig) {

@jamos-tayjamos-tayMar 19, 2019

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Had to move this down for eslint because it references calculateNewBaseUrl, only lines 208-210 are added

@nicholaschuayunzhi

nicholaschuayunzhi commented Mar 19, 2019

Copy link
Copy Markdown
Contributor

Hi @jamos-tay was testing your case and it works which is great.

However, when you create an "outer" root_variables.md, and reference it in index.md from the root site, it won't work.

This is because when we will configure nunjucks for the sub site, we haven't called nunjucks#renderString for the outer site variables. So when nunjucks tries to render a variable in the root site we get this error: Error: template not found: root_variables.md. (our nunjucks path is already the sub site)

@damithc

Copy link
Copy Markdown
Contributor

@openorclose see if this PR can be salvaged as some work has been done already. It would be a pity to let that go to waste, if it can be helped.

@le0tanle0tan added the pr.BugFix 🐛 Fixes correct a programming error/assumption label Apr 22, 2020
@ang-zeyu

Copy link
Copy Markdown
Contributor

Closing this per #931 (comment)

@ang-zeyuang-zeyu closed this Jun 7, 2020
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr.BugFix 🐛Fixes correct a programming error/assumption

Projects

None yet

Development

Successfully merging this pull request may close these issues.

nunjucks syntax does not work if site is built outside of site root folder

7 participants

@jamos-tay@damithc@Chng-Zhi-Xuan@nicholaschuayunzhi@acjh@ang-zeyu@le0tan