Support content insertion into <head> of a Page - #361

Merged
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files
Jul 25, 2018
Merged

Support content insertion into <head> of a Page#361
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files

Conversation

@Chng-Zhi-Xuan

@Chng-Zhi-XuanChng-Zhi-Xuan commented Jul 23, 2018

Copy link
Copy Markdown
Contributor

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

• [x] New feature

Resolves#355

What is the rationale for this request?
User would like to easily insert their own script or css files into the <head> of a page.

What changes did you make? (Give an overview)

  • Have Site initialise a new head folder within the _markbind folder.
  • Insert logic for Page to process the specified head file in front-matter
  • Update page.ejs template to insert content from head file
  • Update Site unit tests
  • Add code and files to test content insertion within test_site
  • Add description to user guide
// Within customScript.jsconsole.log('custom script inserted into the head successfully!');
In consoleIn Page HTML
355-demo-1355-demo-2

Is there anything you'd like reviewers to focus on?

  • Method / Variable naming
  • Whether is there a need to do nunjucks.renderString within collectHeadFiles
  • User Guide wording

Testing instructions:

  1. Checkout this PR's branch and navigate to test_site folder.
  2. Run markbind serve and check console for the success message from inserted script
  3. Add new folders with CSS or JS files in the root
  4. Use the appropriate syntax and add them inside myCustomHead.md
  5. Run markbind serve and you should see the <head> having your newly authored content from myCustomHead.md along with the files in Sources tab (in Chrome).

@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a Page[WIP] Support content insertion into <head> of a PageJul 23, 2018
@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a PageSupport content insertion into <head> of a PageJul 24, 2018
@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Jul 24, 2018

Copy link
Copy Markdown
ContributorAuthor

Update

  • Add user guide section
  • Update PR title and description
  • Ready for review

Comment threadlib/Page.js Outdated
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);
this.headFileReferences = headFileMappedData.trim();
return pageData;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems like the pageData is not used at all in this method, so it is not necessary.

Therefore, we can call this method before the line this.headFileReferences = nunjucks.renderString(this.headFileReferences, { baseUrl, hostBaseUrl }); instead of doing .then(result => this.collectHeadFiles(result)).

Comment threadlib/Page.js
// Map variables
const newBaseUrl = calculateNewBaseUrl(this.sourcePath, this.rootPath, this.baseUrlMap) || '';
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this rendering necessary? Seems to still work for me when I commented it out. Also the render method seems to be called again below.

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.

It is useful if the user predefined a <style> or <link> variable and used it in headFile.md.

The render method below is specifically for resolving {{baseUrl}}.

Comment threaddocs/userGuide/contentAuthoring.md Outdated

### Inserting content into a page's head element

While authoring your website, you may want to have your own CSS or Javascript file to be included in a page.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

file -> files

Comment threaddocs/userGuide/contentAuthoring.md Outdated
- More than one head file can be created for different pages.

- Author your `<style>` elements for CSS files and `<link>` elements for Javascript files using HTML as shown below.
- Ensure that any url starts from the root directory <code>{<span></span>{baseUrl}}/</code> when you are referencing your files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ensure that any url starts... -> Ensure that your URLs start...
... from the root directory {{baseUrl}} ... -> ... from the root directory, by using {{baseUrl}} ...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
<script src="{{baseUrl}}/yourScriptFolder/myCustomScript.js"></script>
```

- Specify the head file in pages that you want it, within the [front matter](#front-matter) `head` attribute.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

...that you want it, within the... -> ...that uses it, by specifying the...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
```

The head file contents will be placed near the end of the page's head tag.
It will override existing Bootstrap and MarkBind CSS styles if there is an overlap.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It will... -> Your head file will...
there is an overlap -> there is an overlap of classes.

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.

... overlap of classes -> ... overlap of selectors

Doc here

@yamgent

Copy link
Copy Markdown
Member

Also by any chance, is it possible to support live preview for changes to the head files?

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Apply changes requested
  • Add support for page regeneration on head file change


```html
<!-- In _markbind/head/compiledRef.md -->
<link rel="stylesheet" href="{{baseUrl}}/yourCSSFolder/subfolder/myCustomStyle.css">

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

{{baseUrl}} is not getting rendered (see Netlify preview).

@yamgent

Copy link
Copy Markdown
Member

@Chng-Zhi-Xuan the commits need to be squashed.

As discussed with Prof, we can live with the {{baseUrl}} documentation problem for now, and fix it in a separate PR (in fact, another section also have the {{baseUrl}} documentation problem, so might as well solve everything later).

Will merge it as soon as it is squashed.

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Squashed commits

@yamgentyamgent added this to the v1.9.2 milestone Jul 25, 2018
@yamgent
yamgent merged commit 97711ef into MarkBind:masterJul 25, 2018
@damithc

Copy link
Copy Markdown
Contributor

@Chng-Zhi-Xuan I'm having trouble getting this to work in website-base. Can you try it out?
Attached files:

  • _/markbind/head/scheduleHead.md
  • schedule/index.md

head files.zip

I got the feature to work in other places. In fact I can include scheduleHead.md as the head in other files. But when I include it in schedule/index.md, it doesn't get inserted into the head.

@damithc

Copy link
Copy Markdown
Contributor

To add to the above, full code available in the scheduleHead branch https://github.com/nus-cs2103/website-base/tree/scheduleHead

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

@damithc

Findings:

  • Clicking on "Schedule" in the main page's navbar directs to /website-base/index.html, which does not specify any head file in the front-matter.

  • Navigating to /website-base/schedule/index.html and it has the specified head file as shown below.

361-head-content

This is intended behaviour as <include> ignores the file's front-matter.

A quick fix is to specify scheduleHead.md in the main page's index.md 😄

@damithc

Copy link
Copy Markdown
Contributor

Indeed that should be the problem. My bad. Sorry. Thanks for the help.

@Chng-Zhi-Xuan
Chng-Zhi-Xuan deleted the 355-insert-head-files branch May 21, 2019 06:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support google analytics

3 participants

@Chng-Zhi-Xuan@yamgent@damithc
, '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

Support content insertion into <head> of a Page - #361

Merged
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files
Jul 25, 2018
Merged

Support content insertion into <head> of a Page#361
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files

Conversation

@Chng-Zhi-Xuan

@Chng-Zhi-XuanChng-Zhi-Xuan commented Jul 23, 2018

Copy link
Copy Markdown
Contributor

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

• [x] New feature

Resolves#355

What is the rationale for this request?
User would like to easily insert their own script or css files into the <head> of a page.

What changes did you make? (Give an overview)

  • Have Site initialise a new head folder within the _markbind folder.
  • Insert logic for Page to process the specified head file in front-matter
  • Update page.ejs template to insert content from head file
  • Update Site unit tests
  • Add code and files to test content insertion within test_site
  • Add description to user guide
// Within customScript.jsconsole.log('custom script inserted into the head successfully!');
In consoleIn Page HTML
355-demo-1355-demo-2

Is there anything you'd like reviewers to focus on?

  • Method / Variable naming
  • Whether is there a need to do nunjucks.renderString within collectHeadFiles
  • User Guide wording

Testing instructions:

  1. Checkout this PR's branch and navigate to test_site folder.
  2. Run markbind serve and check console for the success message from inserted script
  3. Add new folders with CSS or JS files in the root
  4. Use the appropriate syntax and add them inside myCustomHead.md
  5. Run markbind serve and you should see the <head> having your newly authored content from myCustomHead.md along with the files in Sources tab (in Chrome).

@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a Page[WIP] Support content insertion into <head> of a PageJul 23, 2018
@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a PageSupport content insertion into <head> of a PageJul 24, 2018
@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Jul 24, 2018

Copy link
Copy Markdown
ContributorAuthor

Update

  • Add user guide section
  • Update PR title and description
  • Ready for review

Comment threadlib/Page.js Outdated
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);
this.headFileReferences = headFileMappedData.trim();
return pageData;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems like the pageData is not used at all in this method, so it is not necessary.

Therefore, we can call this method before the line this.headFileReferences = nunjucks.renderString(this.headFileReferences, { baseUrl, hostBaseUrl }); instead of doing .then(result => this.collectHeadFiles(result)).

Comment threadlib/Page.js
// Map variables
const newBaseUrl = calculateNewBaseUrl(this.sourcePath, this.rootPath, this.baseUrlMap) || '';
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this rendering necessary? Seems to still work for me when I commented it out. Also the render method seems to be called again below.

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.

It is useful if the user predefined a <style> or <link> variable and used it in headFile.md.

The render method below is specifically for resolving {{baseUrl}}.

Comment threaddocs/userGuide/contentAuthoring.md Outdated

### Inserting content into a page's head element

While authoring your website, you may want to have your own CSS or Javascript file to be included in a page.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

file -> files

Comment threaddocs/userGuide/contentAuthoring.md Outdated
- More than one head file can be created for different pages.

- Author your `<style>` elements for CSS files and `<link>` elements for Javascript files using HTML as shown below.
- Ensure that any url starts from the root directory <code>{<span></span>{baseUrl}}/</code> when you are referencing your files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ensure that any url starts... -> Ensure that your URLs start...
... from the root directory {{baseUrl}} ... -> ... from the root directory, by using {{baseUrl}} ...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
<script src="{{baseUrl}}/yourScriptFolder/myCustomScript.js"></script>
```

- Specify the head file in pages that you want it, within the [front matter](#front-matter) `head` attribute.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

...that you want it, within the... -> ...that uses it, by specifying the...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
```

The head file contents will be placed near the end of the page's head tag.
It will override existing Bootstrap and MarkBind CSS styles if there is an overlap.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It will... -> Your head file will...
there is an overlap -> there is an overlap of classes.

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.

... overlap of classes -> ... overlap of selectors

Doc here

@yamgent

Copy link
Copy Markdown
Member

Also by any chance, is it possible to support live preview for changes to the head files?

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Apply changes requested
  • Add support for page regeneration on head file change


```html
<!-- In _markbind/head/compiledRef.md -->
<link rel="stylesheet" href="{{baseUrl}}/yourCSSFolder/subfolder/myCustomStyle.css">

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

{{baseUrl}} is not getting rendered (see Netlify preview).

@yamgent

Copy link
Copy Markdown
Member

@Chng-Zhi-Xuan the commits need to be squashed.

As discussed with Prof, we can live with the {{baseUrl}} documentation problem for now, and fix it in a separate PR (in fact, another section also have the {{baseUrl}} documentation problem, so might as well solve everything later).

Will merge it as soon as it is squashed.

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Squashed commits

@yamgentyamgent added this to the v1.9.2 milestone Jul 25, 2018
@yamgent
yamgent merged commit 97711ef into MarkBind:masterJul 25, 2018
@damithc

Copy link
Copy Markdown
Contributor

@Chng-Zhi-Xuan I'm having trouble getting this to work in website-base. Can you try it out?
Attached files:

  • _/markbind/head/scheduleHead.md
  • schedule/index.md

head files.zip

I got the feature to work in other places. In fact I can include scheduleHead.md as the head in other files. But when I include it in schedule/index.md, it doesn't get inserted into the head.

@damithc

Copy link
Copy Markdown
Contributor

To add to the above, full code available in the scheduleHead branch https://github.com/nus-cs2103/website-base/tree/scheduleHead

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

@damithc

Findings:

  • Clicking on "Schedule" in the main page's navbar directs to /website-base/index.html, which does not specify any head file in the front-matter.

  • Navigating to /website-base/schedule/index.html and it has the specified head file as shown below.

361-head-content

This is intended behaviour as <include> ignores the file's front-matter.

A quick fix is to specify scheduleHead.md in the main page's index.md 😄

@damithc

Copy link
Copy Markdown
Contributor

Indeed that should be the problem. My bad. Sorry. Thanks for the help.

@Chng-Zhi-Xuan
Chng-Zhi-Xuan deleted the 355-insert-head-files branch May 21, 2019 06:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support google analytics

3 participants

@Chng-Zhi-Xuan@yamgent@damithc
, '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

Support content insertion into <head> of a Page - #361

Merged
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files
Jul 25, 2018
Merged

Support content insertion into <head> of a Page#361
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files

Conversation

@Chng-Zhi-Xuan

@Chng-Zhi-XuanChng-Zhi-Xuan commented Jul 23, 2018

Copy link
Copy Markdown
Contributor

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

• [x] New feature

Resolves#355

What is the rationale for this request?
User would like to easily insert their own script or css files into the <head> of a page.

What changes did you make? (Give an overview)

  • Have Site initialise a new head folder within the _markbind folder.
  • Insert logic for Page to process the specified head file in front-matter
  • Update page.ejs template to insert content from head file
  • Update Site unit tests
  • Add code and files to test content insertion within test_site
  • Add description to user guide
// Within customScript.jsconsole.log('custom script inserted into the head successfully!');
In consoleIn Page HTML
355-demo-1355-demo-2

Is there anything you'd like reviewers to focus on?

  • Method / Variable naming
  • Whether is there a need to do nunjucks.renderString within collectHeadFiles
  • User Guide wording

Testing instructions:

  1. Checkout this PR's branch and navigate to test_site folder.
  2. Run markbind serve and check console for the success message from inserted script
  3. Add new folders with CSS or JS files in the root
  4. Use the appropriate syntax and add them inside myCustomHead.md
  5. Run markbind serve and you should see the <head> having your newly authored content from myCustomHead.md along with the files in Sources tab (in Chrome).

@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a Page[WIP] Support content insertion into <head> of a PageJul 23, 2018
@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a PageSupport content insertion into <head> of a PageJul 24, 2018
@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Jul 24, 2018

Copy link
Copy Markdown
ContributorAuthor

Update

  • Add user guide section
  • Update PR title and description
  • Ready for review

Comment threadlib/Page.js Outdated
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);
this.headFileReferences = headFileMappedData.trim();
return pageData;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems like the pageData is not used at all in this method, so it is not necessary.

Therefore, we can call this method before the line this.headFileReferences = nunjucks.renderString(this.headFileReferences, { baseUrl, hostBaseUrl }); instead of doing .then(result => this.collectHeadFiles(result)).

Comment threadlib/Page.js
// Map variables
const newBaseUrl = calculateNewBaseUrl(this.sourcePath, this.rootPath, this.baseUrlMap) || '';
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this rendering necessary? Seems to still work for me when I commented it out. Also the render method seems to be called again below.

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.

It is useful if the user predefined a <style> or <link> variable and used it in headFile.md.

The render method below is specifically for resolving {{baseUrl}}.

Comment threaddocs/userGuide/contentAuthoring.md Outdated

### Inserting content into a page's head element

While authoring your website, you may want to have your own CSS or Javascript file to be included in a page.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

file -> files

Comment threaddocs/userGuide/contentAuthoring.md Outdated
- More than one head file can be created for different pages.

- Author your `<style>` elements for CSS files and `<link>` elements for Javascript files using HTML as shown below.
- Ensure that any url starts from the root directory <code>{<span></span>{baseUrl}}/</code> when you are referencing your files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ensure that any url starts... -> Ensure that your URLs start...
... from the root directory {{baseUrl}} ... -> ... from the root directory, by using {{baseUrl}} ...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
<script src="{{baseUrl}}/yourScriptFolder/myCustomScript.js"></script>
```

- Specify the head file in pages that you want it, within the [front matter](#front-matter) `head` attribute.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

...that you want it, within the... -> ...that uses it, by specifying the...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
```

The head file contents will be placed near the end of the page's head tag.
It will override existing Bootstrap and MarkBind CSS styles if there is an overlap.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It will... -> Your head file will...
there is an overlap -> there is an overlap of classes.

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.

... overlap of classes -> ... overlap of selectors

Doc here

@yamgent

Copy link
Copy Markdown
Member

Also by any chance, is it possible to support live preview for changes to the head files?

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Apply changes requested
  • Add support for page regeneration on head file change


```html
<!-- In _markbind/head/compiledRef.md -->
<link rel="stylesheet" href="{{baseUrl}}/yourCSSFolder/subfolder/myCustomStyle.css">

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

{{baseUrl}} is not getting rendered (see Netlify preview).

@yamgent

Copy link
Copy Markdown
Member

@Chng-Zhi-Xuan the commits need to be squashed.

As discussed with Prof, we can live with the {{baseUrl}} documentation problem for now, and fix it in a separate PR (in fact, another section also have the {{baseUrl}} documentation problem, so might as well solve everything later).

Will merge it as soon as it is squashed.

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Squashed commits

@yamgentyamgent added this to the v1.9.2 milestone Jul 25, 2018
@yamgent
yamgent merged commit 97711ef into MarkBind:masterJul 25, 2018
@damithc

Copy link
Copy Markdown
Contributor

@Chng-Zhi-Xuan I'm having trouble getting this to work in website-base. Can you try it out?
Attached files:

  • _/markbind/head/scheduleHead.md
  • schedule/index.md

head files.zip

I got the feature to work in other places. In fact I can include scheduleHead.md as the head in other files. But when I include it in schedule/index.md, it doesn't get inserted into the head.

@damithc

Copy link
Copy Markdown
Contributor

To add to the above, full code available in the scheduleHead branch https://github.com/nus-cs2103/website-base/tree/scheduleHead

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

@damithc

Findings:

  • Clicking on "Schedule" in the main page's navbar directs to /website-base/index.html, which does not specify any head file in the front-matter.

  • Navigating to /website-base/schedule/index.html and it has the specified head file as shown below.

361-head-content

This is intended behaviour as <include> ignores the file's front-matter.

A quick fix is to specify scheduleHead.md in the main page's index.md 😄

@damithc

Copy link
Copy Markdown
Contributor

Indeed that should be the problem. My bad. Sorry. Thanks for the help.

@Chng-Zhi-Xuan
Chng-Zhi-Xuan deleted the 355-insert-head-files branch May 21, 2019 06:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support google analytics

3 participants

@Chng-Zhi-Xuan@yamgent@damithc
, '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

Support content insertion into <head> of a Page - #361

Merged
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files
Jul 25, 2018
Merged

Support content insertion into <head> of a Page#361
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files

Conversation

@Chng-Zhi-Xuan

@Chng-Zhi-XuanChng-Zhi-Xuan commented Jul 23, 2018

Copy link
Copy Markdown
Contributor

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

• [x] New feature

Resolves#355

What is the rationale for this request?
User would like to easily insert their own script or css files into the <head> of a page.

What changes did you make? (Give an overview)

  • Have Site initialise a new head folder within the _markbind folder.
  • Insert logic for Page to process the specified head file in front-matter
  • Update page.ejs template to insert content from head file
  • Update Site unit tests
  • Add code and files to test content insertion within test_site
  • Add description to user guide
// Within customScript.jsconsole.log('custom script inserted into the head successfully!');
In consoleIn Page HTML
355-demo-1355-demo-2

Is there anything you'd like reviewers to focus on?

  • Method / Variable naming
  • Whether is there a need to do nunjucks.renderString within collectHeadFiles
  • User Guide wording

Testing instructions:

  1. Checkout this PR's branch and navigate to test_site folder.
  2. Run markbind serve and check console for the success message from inserted script
  3. Add new folders with CSS or JS files in the root
  4. Use the appropriate syntax and add them inside myCustomHead.md
  5. Run markbind serve and you should see the <head> having your newly authored content from myCustomHead.md along with the files in Sources tab (in Chrome).

@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a Page[WIP] Support content insertion into <head> of a PageJul 23, 2018
@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a PageSupport content insertion into <head> of a PageJul 24, 2018
@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Jul 24, 2018

Copy link
Copy Markdown
ContributorAuthor

Update

  • Add user guide section
  • Update PR title and description
  • Ready for review

Comment threadlib/Page.js Outdated
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);
this.headFileReferences = headFileMappedData.trim();
return pageData;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems like the pageData is not used at all in this method, so it is not necessary.

Therefore, we can call this method before the line this.headFileReferences = nunjucks.renderString(this.headFileReferences, { baseUrl, hostBaseUrl }); instead of doing .then(result => this.collectHeadFiles(result)).

Comment threadlib/Page.js
// Map variables
const newBaseUrl = calculateNewBaseUrl(this.sourcePath, this.rootPath, this.baseUrlMap) || '';
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this rendering necessary? Seems to still work for me when I commented it out. Also the render method seems to be called again below.

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.

It is useful if the user predefined a <style> or <link> variable and used it in headFile.md.

The render method below is specifically for resolving {{baseUrl}}.

Comment threaddocs/userGuide/contentAuthoring.md Outdated

### Inserting content into a page's head element

While authoring your website, you may want to have your own CSS or Javascript file to be included in a page.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

file -> files

Comment threaddocs/userGuide/contentAuthoring.md Outdated
- More than one head file can be created for different pages.

- Author your `<style>` elements for CSS files and `<link>` elements for Javascript files using HTML as shown below.
- Ensure that any url starts from the root directory <code>{<span></span>{baseUrl}}/</code> when you are referencing your files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ensure that any url starts... -> Ensure that your URLs start...
... from the root directory {{baseUrl}} ... -> ... from the root directory, by using {{baseUrl}} ...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
<script src="{{baseUrl}}/yourScriptFolder/myCustomScript.js"></script>
```

- Specify the head file in pages that you want it, within the [front matter](#front-matter) `head` attribute.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

...that you want it, within the... -> ...that uses it, by specifying the...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
```

The head file contents will be placed near the end of the page's head tag.
It will override existing Bootstrap and MarkBind CSS styles if there is an overlap.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It will... -> Your head file will...
there is an overlap -> there is an overlap of classes.

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.

... overlap of classes -> ... overlap of selectors

Doc here

@yamgent

Copy link
Copy Markdown
Member

Also by any chance, is it possible to support live preview for changes to the head files?

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Apply changes requested
  • Add support for page regeneration on head file change


```html
<!-- In _markbind/head/compiledRef.md -->
<link rel="stylesheet" href="{{baseUrl}}/yourCSSFolder/subfolder/myCustomStyle.css">

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

{{baseUrl}} is not getting rendered (see Netlify preview).

@yamgent

Copy link
Copy Markdown
Member

@Chng-Zhi-Xuan the commits need to be squashed.

As discussed with Prof, we can live with the {{baseUrl}} documentation problem for now, and fix it in a separate PR (in fact, another section also have the {{baseUrl}} documentation problem, so might as well solve everything later).

Will merge it as soon as it is squashed.

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Squashed commits

@yamgentyamgent added this to the v1.9.2 milestone Jul 25, 2018
@yamgent
yamgent merged commit 97711ef into MarkBind:masterJul 25, 2018
@damithc

Copy link
Copy Markdown
Contributor

@Chng-Zhi-Xuan I'm having trouble getting this to work in website-base. Can you try it out?
Attached files:

  • _/markbind/head/scheduleHead.md
  • schedule/index.md

head files.zip

I got the feature to work in other places. In fact I can include scheduleHead.md as the head in other files. But when I include it in schedule/index.md, it doesn't get inserted into the head.

@damithc

Copy link
Copy Markdown
Contributor

To add to the above, full code available in the scheduleHead branch https://github.com/nus-cs2103/website-base/tree/scheduleHead

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

@damithc

Findings:

  • Clicking on "Schedule" in the main page's navbar directs to /website-base/index.html, which does not specify any head file in the front-matter.

  • Navigating to /website-base/schedule/index.html and it has the specified head file as shown below.

361-head-content

This is intended behaviour as <include> ignores the file's front-matter.

A quick fix is to specify scheduleHead.md in the main page's index.md 😄

@damithc

Copy link
Copy Markdown
Contributor

Indeed that should be the problem. My bad. Sorry. Thanks for the help.

@Chng-Zhi-Xuan
Chng-Zhi-Xuan deleted the 355-insert-head-files branch May 21, 2019 06:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support google analytics

3 participants

@Chng-Zhi-Xuan@yamgent@damithc
, '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

Support content insertion into <head> of a Page - #361

Merged
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files
Jul 25, 2018
Merged

Support content insertion into <head> of a Page#361
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files

Conversation

@Chng-Zhi-Xuan

@Chng-Zhi-XuanChng-Zhi-Xuan commented Jul 23, 2018

Copy link
Copy Markdown
Contributor

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

• [x] New feature

Resolves#355

What is the rationale for this request?
User would like to easily insert their own script or css files into the <head> of a page.

What changes did you make? (Give an overview)

  • Have Site initialise a new head folder within the _markbind folder.
  • Insert logic for Page to process the specified head file in front-matter
  • Update page.ejs template to insert content from head file
  • Update Site unit tests
  • Add code and files to test content insertion within test_site
  • Add description to user guide
// Within customScript.jsconsole.log('custom script inserted into the head successfully!');
In consoleIn Page HTML
355-demo-1355-demo-2

Is there anything you'd like reviewers to focus on?

  • Method / Variable naming
  • Whether is there a need to do nunjucks.renderString within collectHeadFiles
  • User Guide wording

Testing instructions:

  1. Checkout this PR's branch and navigate to test_site folder.
  2. Run markbind serve and check console for the success message from inserted script
  3. Add new folders with CSS or JS files in the root
  4. Use the appropriate syntax and add them inside myCustomHead.md
  5. Run markbind serve and you should see the <head> having your newly authored content from myCustomHead.md along with the files in Sources tab (in Chrome).

@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a Page[WIP] Support content insertion into <head> of a PageJul 23, 2018
@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a PageSupport content insertion into <head> of a PageJul 24, 2018
@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Jul 24, 2018

Copy link
Copy Markdown
ContributorAuthor

Update

  • Add user guide section
  • Update PR title and description
  • Ready for review

Comment threadlib/Page.js Outdated
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);
this.headFileReferences = headFileMappedData.trim();
return pageData;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems like the pageData is not used at all in this method, so it is not necessary.

Therefore, we can call this method before the line this.headFileReferences = nunjucks.renderString(this.headFileReferences, { baseUrl, hostBaseUrl }); instead of doing .then(result => this.collectHeadFiles(result)).

Comment threadlib/Page.js
// Map variables
const newBaseUrl = calculateNewBaseUrl(this.sourcePath, this.rootPath, this.baseUrlMap) || '';
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this rendering necessary? Seems to still work for me when I commented it out. Also the render method seems to be called again below.

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.

It is useful if the user predefined a <style> or <link> variable and used it in headFile.md.

The render method below is specifically for resolving {{baseUrl}}.

Comment threaddocs/userGuide/contentAuthoring.md Outdated

### Inserting content into a page's head element

While authoring your website, you may want to have your own CSS or Javascript file to be included in a page.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

file -> files

Comment threaddocs/userGuide/contentAuthoring.md Outdated
- More than one head file can be created for different pages.

- Author your `<style>` elements for CSS files and `<link>` elements for Javascript files using HTML as shown below.
- Ensure that any url starts from the root directory <code>{<span></span>{baseUrl}}/</code> when you are referencing your files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ensure that any url starts... -> Ensure that your URLs start...
... from the root directory {{baseUrl}} ... -> ... from the root directory, by using {{baseUrl}} ...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
<script src="{{baseUrl}}/yourScriptFolder/myCustomScript.js"></script>
```

- Specify the head file in pages that you want it, within the [front matter](#front-matter) `head` attribute.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

...that you want it, within the... -> ...that uses it, by specifying the...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
```

The head file contents will be placed near the end of the page's head tag.
It will override existing Bootstrap and MarkBind CSS styles if there is an overlap.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It will... -> Your head file will...
there is an overlap -> there is an overlap of classes.

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.

... overlap of classes -> ... overlap of selectors

Doc here

@yamgent

Copy link
Copy Markdown
Member

Also by any chance, is it possible to support live preview for changes to the head files?

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Apply changes requested
  • Add support for page regeneration on head file change


```html
<!-- In _markbind/head/compiledRef.md -->
<link rel="stylesheet" href="{{baseUrl}}/yourCSSFolder/subfolder/myCustomStyle.css">

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

{{baseUrl}} is not getting rendered (see Netlify preview).

@yamgent

Copy link
Copy Markdown
Member

@Chng-Zhi-Xuan the commits need to be squashed.

As discussed with Prof, we can live with the {{baseUrl}} documentation problem for now, and fix it in a separate PR (in fact, another section also have the {{baseUrl}} documentation problem, so might as well solve everything later).

Will merge it as soon as it is squashed.

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Squashed commits

@yamgentyamgent added this to the v1.9.2 milestone Jul 25, 2018
@yamgent
yamgent merged commit 97711ef into MarkBind:masterJul 25, 2018
@damithc

Copy link
Copy Markdown
Contributor

@Chng-Zhi-Xuan I'm having trouble getting this to work in website-base. Can you try it out?
Attached files:

  • _/markbind/head/scheduleHead.md
  • schedule/index.md

head files.zip

I got the feature to work in other places. In fact I can include scheduleHead.md as the head in other files. But when I include it in schedule/index.md, it doesn't get inserted into the head.

@damithc

Copy link
Copy Markdown
Contributor

To add to the above, full code available in the scheduleHead branch https://github.com/nus-cs2103/website-base/tree/scheduleHead

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

@damithc

Findings:

  • Clicking on "Schedule" in the main page's navbar directs to /website-base/index.html, which does not specify any head file in the front-matter.

  • Navigating to /website-base/schedule/index.html and it has the specified head file as shown below.

361-head-content

This is intended behaviour as <include> ignores the file's front-matter.

A quick fix is to specify scheduleHead.md in the main page's index.md 😄

@damithc

Copy link
Copy Markdown
Contributor

Indeed that should be the problem. My bad. Sorry. Thanks for the help.

@Chng-Zhi-Xuan
Chng-Zhi-Xuan deleted the 355-insert-head-files branch May 21, 2019 06:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support google analytics

3 participants

@Chng-Zhi-Xuan@yamgent@damithc
, '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

Support content insertion into <head> of a Page - #361

Merged
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files
Jul 25, 2018
Merged

Support content insertion into <head> of a Page#361
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files

Conversation

@Chng-Zhi-Xuan

@Chng-Zhi-XuanChng-Zhi-Xuan commented Jul 23, 2018

Copy link
Copy Markdown
Contributor

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

• [x] New feature

Resolves#355

What is the rationale for this request?
User would like to easily insert their own script or css files into the <head> of a page.

What changes did you make? (Give an overview)

  • Have Site initialise a new head folder within the _markbind folder.
  • Insert logic for Page to process the specified head file in front-matter
  • Update page.ejs template to insert content from head file
  • Update Site unit tests
  • Add code and files to test content insertion within test_site
  • Add description to user guide
// Within customScript.jsconsole.log('custom script inserted into the head successfully!');
In consoleIn Page HTML
355-demo-1355-demo-2

Is there anything you'd like reviewers to focus on?

  • Method / Variable naming
  • Whether is there a need to do nunjucks.renderString within collectHeadFiles
  • User Guide wording

Testing instructions:

  1. Checkout this PR's branch and navigate to test_site folder.
  2. Run markbind serve and check console for the success message from inserted script
  3. Add new folders with CSS or JS files in the root
  4. Use the appropriate syntax and add them inside myCustomHead.md
  5. Run markbind serve and you should see the <head> having your newly authored content from myCustomHead.md along with the files in Sources tab (in Chrome).

@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a Page[WIP] Support content insertion into <head> of a PageJul 23, 2018
@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a PageSupport content insertion into <head> of a PageJul 24, 2018
@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Jul 24, 2018

Copy link
Copy Markdown
ContributorAuthor

Update

  • Add user guide section
  • Update PR title and description
  • Ready for review

Comment threadlib/Page.js Outdated
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);
this.headFileReferences = headFileMappedData.trim();
return pageData;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems like the pageData is not used at all in this method, so it is not necessary.

Therefore, we can call this method before the line this.headFileReferences = nunjucks.renderString(this.headFileReferences, { baseUrl, hostBaseUrl }); instead of doing .then(result => this.collectHeadFiles(result)).

Comment threadlib/Page.js
// Map variables
const newBaseUrl = calculateNewBaseUrl(this.sourcePath, this.rootPath, this.baseUrlMap) || '';
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this rendering necessary? Seems to still work for me when I commented it out. Also the render method seems to be called again below.

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.

It is useful if the user predefined a <style> or <link> variable and used it in headFile.md.

The render method below is specifically for resolving {{baseUrl}}.

Comment threaddocs/userGuide/contentAuthoring.md Outdated

### Inserting content into a page's head element

While authoring your website, you may want to have your own CSS or Javascript file to be included in a page.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

file -> files

Comment threaddocs/userGuide/contentAuthoring.md Outdated
- More than one head file can be created for different pages.

- Author your `<style>` elements for CSS files and `<link>` elements for Javascript files using HTML as shown below.
- Ensure that any url starts from the root directory <code>{<span></span>{baseUrl}}/</code> when you are referencing your files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ensure that any url starts... -> Ensure that your URLs start...
... from the root directory {{baseUrl}} ... -> ... from the root directory, by using {{baseUrl}} ...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
<script src="{{baseUrl}}/yourScriptFolder/myCustomScript.js"></script>
```

- Specify the head file in pages that you want it, within the [front matter](#front-matter) `head` attribute.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

...that you want it, within the... -> ...that uses it, by specifying the...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
```

The head file contents will be placed near the end of the page's head tag.
It will override existing Bootstrap and MarkBind CSS styles if there is an overlap.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It will... -> Your head file will...
there is an overlap -> there is an overlap of classes.

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.

... overlap of classes -> ... overlap of selectors

Doc here

@yamgent

Copy link
Copy Markdown
Member

Also by any chance, is it possible to support live preview for changes to the head files?

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Apply changes requested
  • Add support for page regeneration on head file change


```html
<!-- In _markbind/head/compiledRef.md -->
<link rel="stylesheet" href="{{baseUrl}}/yourCSSFolder/subfolder/myCustomStyle.css">

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

{{baseUrl}} is not getting rendered (see Netlify preview).

@yamgent

Copy link
Copy Markdown
Member

@Chng-Zhi-Xuan the commits need to be squashed.

As discussed with Prof, we can live with the {{baseUrl}} documentation problem for now, and fix it in a separate PR (in fact, another section also have the {{baseUrl}} documentation problem, so might as well solve everything later).

Will merge it as soon as it is squashed.

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Squashed commits

@yamgentyamgent added this to the v1.9.2 milestone Jul 25, 2018
@yamgent
yamgent merged commit 97711ef into MarkBind:masterJul 25, 2018
@damithc

Copy link
Copy Markdown
Contributor

@Chng-Zhi-Xuan I'm having trouble getting this to work in website-base. Can you try it out?
Attached files:

  • _/markbind/head/scheduleHead.md
  • schedule/index.md

head files.zip

I got the feature to work in other places. In fact I can include scheduleHead.md as the head in other files. But when I include it in schedule/index.md, it doesn't get inserted into the head.

@damithc

Copy link
Copy Markdown
Contributor

To add to the above, full code available in the scheduleHead branch https://github.com/nus-cs2103/website-base/tree/scheduleHead

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

@damithc

Findings:

  • Clicking on "Schedule" in the main page's navbar directs to /website-base/index.html, which does not specify any head file in the front-matter.

  • Navigating to /website-base/schedule/index.html and it has the specified head file as shown below.

361-head-content

This is intended behaviour as <include> ignores the file's front-matter.

A quick fix is to specify scheduleHead.md in the main page's index.md 😄

@damithc

Copy link
Copy Markdown
Contributor

Indeed that should be the problem. My bad. Sorry. Thanks for the help.

@Chng-Zhi-Xuan
Chng-Zhi-Xuan deleted the 355-insert-head-files branch May 21, 2019 06:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support google analytics

3 participants

@Chng-Zhi-Xuan@yamgent@damithc
, '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

Support content insertion into <head> of a Page - #361

Merged
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files
Jul 25, 2018
Merged

Support content insertion into <head> of a Page#361
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files

Conversation

@Chng-Zhi-Xuan

@Chng-Zhi-XuanChng-Zhi-Xuan commented Jul 23, 2018

Copy link
Copy Markdown
Contributor

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

• [x] New feature

Resolves#355

What is the rationale for this request?
User would like to easily insert their own script or css files into the <head> of a page.

What changes did you make? (Give an overview)

  • Have Site initialise a new head folder within the _markbind folder.
  • Insert logic for Page to process the specified head file in front-matter
  • Update page.ejs template to insert content from head file
  • Update Site unit tests
  • Add code and files to test content insertion within test_site
  • Add description to user guide
// Within customScript.jsconsole.log('custom script inserted into the head successfully!');
In consoleIn Page HTML
355-demo-1355-demo-2

Is there anything you'd like reviewers to focus on?

  • Method / Variable naming
  • Whether is there a need to do nunjucks.renderString within collectHeadFiles
  • User Guide wording

Testing instructions:

  1. Checkout this PR's branch and navigate to test_site folder.
  2. Run markbind serve and check console for the success message from inserted script
  3. Add new folders with CSS or JS files in the root
  4. Use the appropriate syntax and add them inside myCustomHead.md
  5. Run markbind serve and you should see the <head> having your newly authored content from myCustomHead.md along with the files in Sources tab (in Chrome).

@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a Page[WIP] Support content insertion into <head> of a PageJul 23, 2018
@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a PageSupport content insertion into <head> of a PageJul 24, 2018
@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Jul 24, 2018

Copy link
Copy Markdown
ContributorAuthor

Update

  • Add user guide section
  • Update PR title and description
  • Ready for review

Comment threadlib/Page.js Outdated
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);
this.headFileReferences = headFileMappedData.trim();
return pageData;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems like the pageData is not used at all in this method, so it is not necessary.

Therefore, we can call this method before the line this.headFileReferences = nunjucks.renderString(this.headFileReferences, { baseUrl, hostBaseUrl }); instead of doing .then(result => this.collectHeadFiles(result)).

Comment threadlib/Page.js
// Map variables
const newBaseUrl = calculateNewBaseUrl(this.sourcePath, this.rootPath, this.baseUrlMap) || '';
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this rendering necessary? Seems to still work for me when I commented it out. Also the render method seems to be called again below.

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.

It is useful if the user predefined a <style> or <link> variable and used it in headFile.md.

The render method below is specifically for resolving {{baseUrl}}.

Comment threaddocs/userGuide/contentAuthoring.md Outdated

### Inserting content into a page's head element

While authoring your website, you may want to have your own CSS or Javascript file to be included in a page.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

file -> files

Comment threaddocs/userGuide/contentAuthoring.md Outdated
- More than one head file can be created for different pages.

- Author your `<style>` elements for CSS files and `<link>` elements for Javascript files using HTML as shown below.
- Ensure that any url starts from the root directory <code>{<span></span>{baseUrl}}/</code> when you are referencing your files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ensure that any url starts... -> Ensure that your URLs start...
... from the root directory {{baseUrl}} ... -> ... from the root directory, by using {{baseUrl}} ...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
<script src="{{baseUrl}}/yourScriptFolder/myCustomScript.js"></script>
```

- Specify the head file in pages that you want it, within the [front matter](#front-matter) `head` attribute.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

...that you want it, within the... -> ...that uses it, by specifying the...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
```

The head file contents will be placed near the end of the page's head tag.
It will override existing Bootstrap and MarkBind CSS styles if there is an overlap.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It will... -> Your head file will...
there is an overlap -> there is an overlap of classes.

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.

... overlap of classes -> ... overlap of selectors

Doc here

@yamgent

Copy link
Copy Markdown
Member

Also by any chance, is it possible to support live preview for changes to the head files?

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Apply changes requested
  • Add support for page regeneration on head file change


```html
<!-- In _markbind/head/compiledRef.md -->
<link rel="stylesheet" href="{{baseUrl}}/yourCSSFolder/subfolder/myCustomStyle.css">

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

{{baseUrl}} is not getting rendered (see Netlify preview).

@yamgent

Copy link
Copy Markdown
Member

@Chng-Zhi-Xuan the commits need to be squashed.

As discussed with Prof, we can live with the {{baseUrl}} documentation problem for now, and fix it in a separate PR (in fact, another section also have the {{baseUrl}} documentation problem, so might as well solve everything later).

Will merge it as soon as it is squashed.

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Squashed commits

@yamgentyamgent added this to the v1.9.2 milestone Jul 25, 2018
@yamgent
yamgent merged commit 97711ef into MarkBind:masterJul 25, 2018
@damithc

Copy link
Copy Markdown
Contributor

@Chng-Zhi-Xuan I'm having trouble getting this to work in website-base. Can you try it out?
Attached files:

  • _/markbind/head/scheduleHead.md
  • schedule/index.md

head files.zip

I got the feature to work in other places. In fact I can include scheduleHead.md as the head in other files. But when I include it in schedule/index.md, it doesn't get inserted into the head.

@damithc

Copy link
Copy Markdown
Contributor

To add to the above, full code available in the scheduleHead branch https://github.com/nus-cs2103/website-base/tree/scheduleHead

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

@damithc

Findings:

  • Clicking on "Schedule" in the main page's navbar directs to /website-base/index.html, which does not specify any head file in the front-matter.

  • Navigating to /website-base/schedule/index.html and it has the specified head file as shown below.

361-head-content

This is intended behaviour as <include> ignores the file's front-matter.

A quick fix is to specify scheduleHead.md in the main page's index.md 😄

@damithc

Copy link
Copy Markdown
Contributor

Indeed that should be the problem. My bad. Sorry. Thanks for the help.

@Chng-Zhi-Xuan
Chng-Zhi-Xuan deleted the 355-insert-head-files branch May 21, 2019 06:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support google analytics

3 participants

@Chng-Zhi-Xuan@yamgent@damithc
, '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

Support content insertion into <head> of a Page - #361

Merged
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files
Jul 25, 2018
Merged

Support content insertion into <head> of a Page#361
yamgent merged 6 commits into
MarkBind:masterfrom
Chng-Zhi-Xuan:355-insert-head-files

Conversation

@Chng-Zhi-Xuan

@Chng-Zhi-XuanChng-Zhi-Xuan commented Jul 23, 2018

Copy link
Copy Markdown
Contributor

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

• [x] New feature

Resolves#355

What is the rationale for this request?
User would like to easily insert their own script or css files into the <head> of a page.

What changes did you make? (Give an overview)

  • Have Site initialise a new head folder within the _markbind folder.
  • Insert logic for Page to process the specified head file in front-matter
  • Update page.ejs template to insert content from head file
  • Update Site unit tests
  • Add code and files to test content insertion within test_site
  • Add description to user guide
// Within customScript.jsconsole.log('custom script inserted into the head successfully!');
In consoleIn Page HTML
355-demo-1355-demo-2

Is there anything you'd like reviewers to focus on?

  • Method / Variable naming
  • Whether is there a need to do nunjucks.renderString within collectHeadFiles
  • User Guide wording

Testing instructions:

  1. Checkout this PR's branch and navigate to test_site folder.
  2. Run markbind serve and check console for the success message from inserted script
  3. Add new folders with CSS or JS files in the root
  4. Use the appropriate syntax and add them inside myCustomHead.md
  5. Run markbind serve and you should see the <head> having your newly authored content from myCustomHead.md along with the files in Sources tab (in Chrome).

@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a Page[WIP] Support content insertion into <head> of a PageJul 23, 2018
@Chng-Zhi-XuanChng-Zhi-Xuan changed the title [WIP] Support content insertion into <head> of a PageSupport content insertion into <head> of a PageJul 24, 2018
@Chng-Zhi-Xuan

Chng-Zhi-Xuan commented Jul 24, 2018

Copy link
Copy Markdown
ContributorAuthor

Update

  • Add user guide section
  • Update PR title and description
  • Ready for review

Comment threadlib/Page.js Outdated
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);
this.headFileReferences = headFileMappedData.trim();
return pageData;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems like the pageData is not used at all in this method, so it is not necessary.

Therefore, we can call this method before the line this.headFileReferences = nunjucks.renderString(this.headFileReferences, { baseUrl, hostBaseUrl }); instead of doing .then(result => this.collectHeadFiles(result)).

Comment threadlib/Page.js
// Map variables
const newBaseUrl = calculateNewBaseUrl(this.sourcePath, this.rootPath, this.baseUrlMap) || '';
const userDefinedVariables = this.userDefinedVariablesMap[path.join(this.rootPath, newBaseUrl)];
const headFileMappedData = nunjucks.renderString(headFileContent, userDefinedVariables);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this rendering necessary? Seems to still work for me when I commented it out. Also the render method seems to be called again below.

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.

It is useful if the user predefined a <style> or <link> variable and used it in headFile.md.

The render method below is specifically for resolving {{baseUrl}}.

Comment threaddocs/userGuide/contentAuthoring.md Outdated

### Inserting content into a page's head element

While authoring your website, you may want to have your own CSS or Javascript file to be included in a page.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

file -> files

Comment threaddocs/userGuide/contentAuthoring.md Outdated
- More than one head file can be created for different pages.

- Author your `<style>` elements for CSS files and `<link>` elements for Javascript files using HTML as shown below.
- Ensure that any url starts from the root directory <code>{<span></span>{baseUrl}}/</code> when you are referencing your files.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ensure that any url starts... -> Ensure that your URLs start...
... from the root directory {{baseUrl}} ... -> ... from the root directory, by using {{baseUrl}} ...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
<script src="{{baseUrl}}/yourScriptFolder/myCustomScript.js"></script>
```

- Specify the head file in pages that you want it, within the [front matter](#front-matter) `head` attribute.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

...that you want it, within the... -> ...that uses it, by specifying the...

Comment threaddocs/userGuide/contentAuthoring.md Outdated
```

The head file contents will be placed near the end of the page's head tag.
It will override existing Bootstrap and MarkBind CSS styles if there is an overlap.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It will... -> Your head file will...
there is an overlap -> there is an overlap of classes.

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.

... overlap of classes -> ... overlap of selectors

Doc here

@yamgent

Copy link
Copy Markdown
Member

Also by any chance, is it possible to support live preview for changes to the head files?

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Apply changes requested
  • Add support for page regeneration on head file change


```html
<!-- In _markbind/head/compiledRef.md -->
<link rel="stylesheet" href="{{baseUrl}}/yourCSSFolder/subfolder/myCustomStyle.css">

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

{{baseUrl}} is not getting rendered (see Netlify preview).

@yamgent

Copy link
Copy Markdown
Member

@Chng-Zhi-Xuan the commits need to be squashed.

As discussed with Prof, we can live with the {{baseUrl}} documentation problem for now, and fix it in a separate PR (in fact, another section also have the {{baseUrl}} documentation problem, so might as well solve everything later).

Will merge it as soon as it is squashed.

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

Update

  • Squashed commits

@yamgentyamgent added this to the v1.9.2 milestone Jul 25, 2018
@yamgent
yamgent merged commit 97711ef into MarkBind:masterJul 25, 2018
@damithc

Copy link
Copy Markdown
Contributor

@Chng-Zhi-Xuan I'm having trouble getting this to work in website-base. Can you try it out?
Attached files:

  • _/markbind/head/scheduleHead.md
  • schedule/index.md

head files.zip

I got the feature to work in other places. In fact I can include scheduleHead.md as the head in other files. But when I include it in schedule/index.md, it doesn't get inserted into the head.

@damithc

Copy link
Copy Markdown
Contributor

To add to the above, full code available in the scheduleHead branch https://github.com/nus-cs2103/website-base/tree/scheduleHead

@Chng-Zhi-Xuan

Copy link
Copy Markdown
ContributorAuthor

@damithc

Findings:

  • Clicking on "Schedule" in the main page's navbar directs to /website-base/index.html, which does not specify any head file in the front-matter.

  • Navigating to /website-base/schedule/index.html and it has the specified head file as shown below.

361-head-content

This is intended behaviour as <include> ignores the file's front-matter.

A quick fix is to specify scheduleHead.md in the main page's index.md 😄

@damithc

Copy link
Copy Markdown
Contributor

Indeed that should be the problem. My bad. Sorry. Thanks for the help.

@Chng-Zhi-Xuan
Chng-Zhi-Xuan deleted the 355-insert-head-files branch May 21, 2019 06:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support google analytics

3 participants

@Chng-Zhi-Xuan@yamgent@damithc