Skip to content

Implement page variable functionality - #627

Merged
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables
Feb 4, 2019
Merged

Implement page variable functionality#627
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables

Conversation

@jamos-tay

@jamos-tayjamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
Contributor

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

• [X] Enhancement to an existing feature

Fixes#575

What is the rationale for this request?

Extension of included variable functionality, allow users to specify local variables within the same page.

What changes did you make? (Give an overview)

Users can specify local variables with the variable key word:

<variablename="color">red</variable>

They can use it within the page like normal variables.

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

Should variables cascade into includes? I'm thinking no, it can be confusing if the user is trying to trace where a variable came from and can't find it. If the user wishes for them to be used they can include it specifically:

<variablename="x">5</variable><include...><spanid="x">{{ x }}</span></include>

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

<variable name="x">5</variable>
{{ x }} // 6
<variable name="x">6</variable>
{{ x }} // 6

I don't think supporting this is a good idea since we won't be able to use nunjucks and would have to write our own parser. Users can use {% set %} as an alternative. Currently a warning is shown if the user tries to reassign a variable.

@damithc

Copy link
Copy Markdown
Contributor

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

should we call them constants instead?

<const name="MAX_SIZE">5</const>

@jamos-tay

jamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
ContributorAuthor

We could, but aren't the global variables kind of like constants too, in that case?

@damithc

Copy link
Copy Markdown
Contributor

We could, but aren't the global variables kind of like constants too, in that case?

At the moment, they are too.

@yamgent

Copy link
Copy Markdown
Member

should we call them constants instead?

<const name="MAX_SIZE">5</const>

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

@acjh

acjh commented Jan 24, 2019

Copy link
Copy Markdown
Contributor

We may also consider implementing overriding the sub-sites' variables in future.

@damithc

Copy link
Copy Markdown
Contributor

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

That's true.

We have several types of variables each behaving in a different way; we should come up with a good terminology to differentiate them.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Sure - maybe we should just leave it as variable for now then since that's how variables.md is named?

@jamos-tayjamos-tay changed the title [WIP] Implement page variable functionalityImplement page variable functionalityJan 28, 2019
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Implemented page variables + included variables, should be ready

Comment threadtest/test_site/_markbind/variables.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threadtest/test_site/testPageVariables.md Outdated
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated, page variables can now cascade into included files.

Page variables are now treated exactly like included variables, global > outer > inner priority etc.. The only difference is how they're defined (span vs variable)

Comment threadtest/test_site/testPageVariablesInInclude.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Update documentation
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated

@yamgentyamgent added this to the v1.17.2 milestone Feb 2, 2019
@yamgent
yamgent merged commit 6e2ea26 into MarkBind:masterFeb 4, 2019
@damithc

Copy link
Copy Markdown
Contributor

Good work on this feature @jamos-tay (and @yamgent, @acjh). I've started using it and worked great so far. What do you guys think of allowing the reuse context to access page variables using the # operator?

e.g., <include src="foo.md#title"/> (where title is a page variable in foo.md)

@acjh

acjh commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

Yes. a variable is like a hidden fragment, right? Of course name clashes is a concern but in that case we can follow the same rules as multiple segments with same ID?

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm... I think that implementation might have a few unwanted implications.

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

Accessing a variable value from the parent doesn't mean the variable is raised to the level of the parent. It's simply reading the value only.

I was hoping to use variables as properties of the page. e.g., title, summary, level, difficulty etc. Similar to a public varaible of a Java object, it makes sense to be able to access properties of the object from outside.

Of course, I can use <span id="title" class="d-none">abc</span> instead. Using variables is slightly more convenient.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm okay, that seems reasonable

It would have to be treated separately from a regular include, though

@damithc

Copy link
Copy Markdown
Contributor

Moved the discussion to #682

@ang-zeyuang-zeyu mentioned this pull request Sep 13, 2020
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.

Allow declaration of variable values in the same source file

4 participants

@jamos-tay@damithc@yamgent@acjh
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Implement page variable functionality by jamos-tay · Pull Request #627 · MarkBind/markbind · GitHub
Skip to content

Implement page variable functionality - #627

Merged
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables
Feb 4, 2019
Merged

Implement page variable functionality#627
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables

Conversation

@jamos-tay

@jamos-tayjamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
Contributor

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

• [X] Enhancement to an existing feature

Fixes#575

What is the rationale for this request?

Extension of included variable functionality, allow users to specify local variables within the same page.

What changes did you make? (Give an overview)

Users can specify local variables with the variable key word:

<variablename="color">red</variable>

They can use it within the page like normal variables.

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

Should variables cascade into includes? I'm thinking no, it can be confusing if the user is trying to trace where a variable came from and can't find it. If the user wishes for them to be used they can include it specifically:

<variablename="x">5</variable><include...><spanid="x">{{ x }}</span></include>

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

<variable name="x">5</variable>
{{ x }} // 6
<variable name="x">6</variable>
{{ x }} // 6

I don't think supporting this is a good idea since we won't be able to use nunjucks and would have to write our own parser. Users can use {% set %} as an alternative. Currently a warning is shown if the user tries to reassign a variable.

@damithc

Copy link
Copy Markdown
Contributor

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

should we call them constants instead?

<const name="MAX_SIZE">5</const>

@jamos-tay

jamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
ContributorAuthor

We could, but aren't the global variables kind of like constants too, in that case?

@damithc

Copy link
Copy Markdown
Contributor

We could, but aren't the global variables kind of like constants too, in that case?

At the moment, they are too.

@yamgent

Copy link
Copy Markdown
Member

should we call them constants instead?

<const name="MAX_SIZE">5</const>

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

@acjh

acjh commented Jan 24, 2019

Copy link
Copy Markdown
Contributor

We may also consider implementing overriding the sub-sites' variables in future.

@damithc

Copy link
Copy Markdown
Contributor

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

That's true.

We have several types of variables each behaving in a different way; we should come up with a good terminology to differentiate them.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Sure - maybe we should just leave it as variable for now then since that's how variables.md is named?

@jamos-tayjamos-tay changed the title [WIP] Implement page variable functionalityImplement page variable functionalityJan 28, 2019
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Implemented page variables + included variables, should be ready

Comment threadtest/test_site/_markbind/variables.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threadtest/test_site/testPageVariables.md Outdated
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated, page variables can now cascade into included files.

Page variables are now treated exactly like included variables, global > outer > inner priority etc.. The only difference is how they're defined (span vs variable)

Comment threadtest/test_site/testPageVariablesInInclude.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Update documentation
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated

@yamgentyamgent added this to the v1.17.2 milestone Feb 2, 2019
@yamgent
yamgent merged commit 6e2ea26 into MarkBind:masterFeb 4, 2019
@damithc

Copy link
Copy Markdown
Contributor

Good work on this feature @jamos-tay (and @yamgent, @acjh). I've started using it and worked great so far. What do you guys think of allowing the reuse context to access page variables using the # operator?

e.g., <include src="foo.md#title"/> (where title is a page variable in foo.md)

@acjh

acjh commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

Yes. a variable is like a hidden fragment, right? Of course name clashes is a concern but in that case we can follow the same rules as multiple segments with same ID?

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm... I think that implementation might have a few unwanted implications.

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

Accessing a variable value from the parent doesn't mean the variable is raised to the level of the parent. It's simply reading the value only.

I was hoping to use variables as properties of the page. e.g., title, summary, level, difficulty etc. Similar to a public varaible of a Java object, it makes sense to be able to access properties of the object from outside.

Of course, I can use <span id="title" class="d-none">abc</span> instead. Using variables is slightly more convenient.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm okay, that seems reasonable

It would have to be treated separately from a regular include, though

@damithc

Copy link
Copy Markdown
Contributor

Moved the discussion to #682

@ang-zeyuang-zeyu mentioned this pull request Sep 13, 2020
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.

Allow declaration of variable values in the same source file

4 participants

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

Implement page variable functionality - #627

Merged
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables
Feb 4, 2019
Merged

Implement page variable functionality#627
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables

Conversation

@jamos-tay

@jamos-tayjamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
Contributor

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

• [X] Enhancement to an existing feature

Fixes#575

What is the rationale for this request?

Extension of included variable functionality, allow users to specify local variables within the same page.

What changes did you make? (Give an overview)

Users can specify local variables with the variable key word:

<variablename="color">red</variable>

They can use it within the page like normal variables.

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

Should variables cascade into includes? I'm thinking no, it can be confusing if the user is trying to trace where a variable came from and can't find it. If the user wishes for them to be used they can include it specifically:

<variablename="x">5</variable><include...><spanid="x">{{ x }}</span></include>

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

<variable name="x">5</variable>
{{ x }} // 6
<variable name="x">6</variable>
{{ x }} // 6

I don't think supporting this is a good idea since we won't be able to use nunjucks and would have to write our own parser. Users can use {% set %} as an alternative. Currently a warning is shown if the user tries to reassign a variable.

@damithc

Copy link
Copy Markdown
Contributor

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

should we call them constants instead?

<const name="MAX_SIZE">5</const>

@jamos-tay

jamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
ContributorAuthor

We could, but aren't the global variables kind of like constants too, in that case?

@damithc

Copy link
Copy Markdown
Contributor

We could, but aren't the global variables kind of like constants too, in that case?

At the moment, they are too.

@yamgent

Copy link
Copy Markdown
Member

should we call them constants instead?

<const name="MAX_SIZE">5</const>

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

@acjh

acjh commented Jan 24, 2019

Copy link
Copy Markdown
Contributor

We may also consider implementing overriding the sub-sites' variables in future.

@damithc

Copy link
Copy Markdown
Contributor

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

That's true.

We have several types of variables each behaving in a different way; we should come up with a good terminology to differentiate them.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Sure - maybe we should just leave it as variable for now then since that's how variables.md is named?

@jamos-tayjamos-tay changed the title [WIP] Implement page variable functionalityImplement page variable functionalityJan 28, 2019
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Implemented page variables + included variables, should be ready

Comment threadtest/test_site/_markbind/variables.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threadtest/test_site/testPageVariables.md Outdated
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated, page variables can now cascade into included files.

Page variables are now treated exactly like included variables, global > outer > inner priority etc.. The only difference is how they're defined (span vs variable)

Comment threadtest/test_site/testPageVariablesInInclude.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Update documentation
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated

@yamgentyamgent added this to the v1.17.2 milestone Feb 2, 2019
@yamgent
yamgent merged commit 6e2ea26 into MarkBind:masterFeb 4, 2019
@damithc

Copy link
Copy Markdown
Contributor

Good work on this feature @jamos-tay (and @yamgent, @acjh). I've started using it and worked great so far. What do you guys think of allowing the reuse context to access page variables using the # operator?

e.g., <include src="foo.md#title"/> (where title is a page variable in foo.md)

@acjh

acjh commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

Yes. a variable is like a hidden fragment, right? Of course name clashes is a concern but in that case we can follow the same rules as multiple segments with same ID?

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm... I think that implementation might have a few unwanted implications.

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

Accessing a variable value from the parent doesn't mean the variable is raised to the level of the parent. It's simply reading the value only.

I was hoping to use variables as properties of the page. e.g., title, summary, level, difficulty etc. Similar to a public varaible of a Java object, it makes sense to be able to access properties of the object from outside.

Of course, I can use <span id="title" class="d-none">abc</span> instead. Using variables is slightly more convenient.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm okay, that seems reasonable

It would have to be treated separately from a regular include, though

@damithc

Copy link
Copy Markdown
Contributor

Moved the discussion to #682

@ang-zeyuang-zeyu mentioned this pull request Sep 13, 2020
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.

Allow declaration of variable values in the same source file

4 participants

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

Implement page variable functionality - #627

Merged
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables
Feb 4, 2019
Merged

Implement page variable functionality#627
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables

Conversation

@jamos-tay

@jamos-tayjamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
Contributor

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

• [X] Enhancement to an existing feature

Fixes#575

What is the rationale for this request?

Extension of included variable functionality, allow users to specify local variables within the same page.

What changes did you make? (Give an overview)

Users can specify local variables with the variable key word:

<variablename="color">red</variable>

They can use it within the page like normal variables.

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

Should variables cascade into includes? I'm thinking no, it can be confusing if the user is trying to trace where a variable came from and can't find it. If the user wishes for them to be used they can include it specifically:

<variablename="x">5</variable><include...><spanid="x">{{ x }}</span></include>

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

<variable name="x">5</variable>
{{ x }} // 6
<variable name="x">6</variable>
{{ x }} // 6

I don't think supporting this is a good idea since we won't be able to use nunjucks and would have to write our own parser. Users can use {% set %} as an alternative. Currently a warning is shown if the user tries to reassign a variable.

@damithc

Copy link
Copy Markdown
Contributor

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

should we call them constants instead?

<const name="MAX_SIZE">5</const>

@jamos-tay

jamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
ContributorAuthor

We could, but aren't the global variables kind of like constants too, in that case?

@damithc

Copy link
Copy Markdown
Contributor

We could, but aren't the global variables kind of like constants too, in that case?

At the moment, they are too.

@yamgent

Copy link
Copy Markdown
Member

should we call them constants instead?

<const name="MAX_SIZE">5</const>

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

@acjh

acjh commented Jan 24, 2019

Copy link
Copy Markdown
Contributor

We may also consider implementing overriding the sub-sites' variables in future.

@damithc

Copy link
Copy Markdown
Contributor

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

That's true.

We have several types of variables each behaving in a different way; we should come up with a good terminology to differentiate them.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Sure - maybe we should just leave it as variable for now then since that's how variables.md is named?

@jamos-tayjamos-tay changed the title [WIP] Implement page variable functionalityImplement page variable functionalityJan 28, 2019
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Implemented page variables + included variables, should be ready

Comment threadtest/test_site/_markbind/variables.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threadtest/test_site/testPageVariables.md Outdated
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated, page variables can now cascade into included files.

Page variables are now treated exactly like included variables, global > outer > inner priority etc.. The only difference is how they're defined (span vs variable)

Comment threadtest/test_site/testPageVariablesInInclude.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Update documentation
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated

@yamgentyamgent added this to the v1.17.2 milestone Feb 2, 2019
@yamgent
yamgent merged commit 6e2ea26 into MarkBind:masterFeb 4, 2019
@damithc

Copy link
Copy Markdown
Contributor

Good work on this feature @jamos-tay (and @yamgent, @acjh). I've started using it and worked great so far. What do you guys think of allowing the reuse context to access page variables using the # operator?

e.g., <include src="foo.md#title"/> (where title is a page variable in foo.md)

@acjh

acjh commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

Yes. a variable is like a hidden fragment, right? Of course name clashes is a concern but in that case we can follow the same rules as multiple segments with same ID?

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm... I think that implementation might have a few unwanted implications.

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

Accessing a variable value from the parent doesn't mean the variable is raised to the level of the parent. It's simply reading the value only.

I was hoping to use variables as properties of the page. e.g., title, summary, level, difficulty etc. Similar to a public varaible of a Java object, it makes sense to be able to access properties of the object from outside.

Of course, I can use <span id="title" class="d-none">abc</span> instead. Using variables is slightly more convenient.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm okay, that seems reasonable

It would have to be treated separately from a regular include, though

@damithc

Copy link
Copy Markdown
Contributor

Moved the discussion to #682

@ang-zeyuang-zeyu mentioned this pull request Sep 13, 2020
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.

Allow declaration of variable values in the same source file

4 participants

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

Implement page variable functionality - #627

Merged
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables
Feb 4, 2019
Merged

Implement page variable functionality#627
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables

Conversation

@jamos-tay

@jamos-tayjamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
Contributor

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

• [X] Enhancement to an existing feature

Fixes#575

What is the rationale for this request?

Extension of included variable functionality, allow users to specify local variables within the same page.

What changes did you make? (Give an overview)

Users can specify local variables with the variable key word:

<variablename="color">red</variable>

They can use it within the page like normal variables.

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

Should variables cascade into includes? I'm thinking no, it can be confusing if the user is trying to trace where a variable came from and can't find it. If the user wishes for them to be used they can include it specifically:

<variablename="x">5</variable><include...><spanid="x">{{ x }}</span></include>

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

<variable name="x">5</variable>
{{ x }} // 6
<variable name="x">6</variable>
{{ x }} // 6

I don't think supporting this is a good idea since we won't be able to use nunjucks and would have to write our own parser. Users can use {% set %} as an alternative. Currently a warning is shown if the user tries to reassign a variable.

@damithc

Copy link
Copy Markdown
Contributor

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

should we call them constants instead?

<const name="MAX_SIZE">5</const>

@jamos-tay

jamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
ContributorAuthor

We could, but aren't the global variables kind of like constants too, in that case?

@damithc

Copy link
Copy Markdown
Contributor

We could, but aren't the global variables kind of like constants too, in that case?

At the moment, they are too.

@yamgent

Copy link
Copy Markdown
Member

should we call them constants instead?

<const name="MAX_SIZE">5</const>

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

@acjh

acjh commented Jan 24, 2019

Copy link
Copy Markdown
Contributor

We may also consider implementing overriding the sub-sites' variables in future.

@damithc

Copy link
Copy Markdown
Contributor

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

That's true.

We have several types of variables each behaving in a different way; we should come up with a good terminology to differentiate them.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Sure - maybe we should just leave it as variable for now then since that's how variables.md is named?

@jamos-tayjamos-tay changed the title [WIP] Implement page variable functionalityImplement page variable functionalityJan 28, 2019
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Implemented page variables + included variables, should be ready

Comment threadtest/test_site/_markbind/variables.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threadtest/test_site/testPageVariables.md Outdated
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated, page variables can now cascade into included files.

Page variables are now treated exactly like included variables, global > outer > inner priority etc.. The only difference is how they're defined (span vs variable)

Comment threadtest/test_site/testPageVariablesInInclude.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Update documentation
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated

@yamgentyamgent added this to the v1.17.2 milestone Feb 2, 2019
@yamgent
yamgent merged commit 6e2ea26 into MarkBind:masterFeb 4, 2019
@damithc

Copy link
Copy Markdown
Contributor

Good work on this feature @jamos-tay (and @yamgent, @acjh). I've started using it and worked great so far. What do you guys think of allowing the reuse context to access page variables using the # operator?

e.g., <include src="foo.md#title"/> (where title is a page variable in foo.md)

@acjh

acjh commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

Yes. a variable is like a hidden fragment, right? Of course name clashes is a concern but in that case we can follow the same rules as multiple segments with same ID?

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm... I think that implementation might have a few unwanted implications.

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

Accessing a variable value from the parent doesn't mean the variable is raised to the level of the parent. It's simply reading the value only.

I was hoping to use variables as properties of the page. e.g., title, summary, level, difficulty etc. Similar to a public varaible of a Java object, it makes sense to be able to access properties of the object from outside.

Of course, I can use <span id="title" class="d-none">abc</span> instead. Using variables is slightly more convenient.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm okay, that seems reasonable

It would have to be treated separately from a regular include, though

@damithc

Copy link
Copy Markdown
Contributor

Moved the discussion to #682

@ang-zeyuang-zeyu mentioned this pull request Sep 13, 2020
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.

Allow declaration of variable values in the same source file

4 participants

@jamos-tay@damithc@yamgent@acjh
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Implement page variable functionality by jamos-tay · Pull Request #627 · MarkBind/markbind · GitHub
Skip to content

Implement page variable functionality - #627

Merged
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables
Feb 4, 2019
Merged

Implement page variable functionality#627
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables

Conversation

@jamos-tay

@jamos-tayjamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
Contributor

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

• [X] Enhancement to an existing feature

Fixes#575

What is the rationale for this request?

Extension of included variable functionality, allow users to specify local variables within the same page.

What changes did you make? (Give an overview)

Users can specify local variables with the variable key word:

<variablename="color">red</variable>

They can use it within the page like normal variables.

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

Should variables cascade into includes? I'm thinking no, it can be confusing if the user is trying to trace where a variable came from and can't find it. If the user wishes for them to be used they can include it specifically:

<variablename="x">5</variable><include...><spanid="x">{{ x }}</span></include>

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

<variable name="x">5</variable>
{{ x }} // 6
<variable name="x">6</variable>
{{ x }} // 6

I don't think supporting this is a good idea since we won't be able to use nunjucks and would have to write our own parser. Users can use {% set %} as an alternative. Currently a warning is shown if the user tries to reassign a variable.

@damithc

Copy link
Copy Markdown
Contributor

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

should we call them constants instead?

<const name="MAX_SIZE">5</const>

@jamos-tay

jamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
ContributorAuthor

We could, but aren't the global variables kind of like constants too, in that case?

@damithc

Copy link
Copy Markdown
Contributor

We could, but aren't the global variables kind of like constants too, in that case?

At the moment, they are too.

@yamgent

Copy link
Copy Markdown
Member

should we call them constants instead?

<const name="MAX_SIZE">5</const>

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

@acjh

acjh commented Jan 24, 2019

Copy link
Copy Markdown
Contributor

We may also consider implementing overriding the sub-sites' variables in future.

@damithc

Copy link
Copy Markdown
Contributor

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

That's true.

We have several types of variables each behaving in a different way; we should come up with a good terminology to differentiate them.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Sure - maybe we should just leave it as variable for now then since that's how variables.md is named?

@jamos-tayjamos-tay changed the title [WIP] Implement page variable functionalityImplement page variable functionalityJan 28, 2019
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Implemented page variables + included variables, should be ready

Comment threadtest/test_site/_markbind/variables.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threadtest/test_site/testPageVariables.md Outdated
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated, page variables can now cascade into included files.

Page variables are now treated exactly like included variables, global > outer > inner priority etc.. The only difference is how they're defined (span vs variable)

Comment threadtest/test_site/testPageVariablesInInclude.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Update documentation
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated

@yamgentyamgent added this to the v1.17.2 milestone Feb 2, 2019
@yamgent
yamgent merged commit 6e2ea26 into MarkBind:masterFeb 4, 2019
@damithc

Copy link
Copy Markdown
Contributor

Good work on this feature @jamos-tay (and @yamgent, @acjh). I've started using it and worked great so far. What do you guys think of allowing the reuse context to access page variables using the # operator?

e.g., <include src="foo.md#title"/> (where title is a page variable in foo.md)

@acjh

acjh commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

Yes. a variable is like a hidden fragment, right? Of course name clashes is a concern but in that case we can follow the same rules as multiple segments with same ID?

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm... I think that implementation might have a few unwanted implications.

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

Accessing a variable value from the parent doesn't mean the variable is raised to the level of the parent. It's simply reading the value only.

I was hoping to use variables as properties of the page. e.g., title, summary, level, difficulty etc. Similar to a public varaible of a Java object, it makes sense to be able to access properties of the object from outside.

Of course, I can use <span id="title" class="d-none">abc</span> instead. Using variables is slightly more convenient.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm okay, that seems reasonable

It would have to be treated separately from a regular include, though

@damithc

Copy link
Copy Markdown
Contributor

Moved the discussion to #682

@ang-zeyuang-zeyu mentioned this pull request Sep 13, 2020
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.

Allow declaration of variable values in the same source file

4 participants

@jamos-tay@damithc@yamgent@acjh
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Implement page variable functionality by jamos-tay · Pull Request #627 · MarkBind/markbind · GitHub
Skip to content

Implement page variable functionality - #627

Merged
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables
Feb 4, 2019
Merged

Implement page variable functionality#627
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables

Conversation

@jamos-tay

@jamos-tayjamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
Contributor

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

• [X] Enhancement to an existing feature

Fixes#575

What is the rationale for this request?

Extension of included variable functionality, allow users to specify local variables within the same page.

What changes did you make? (Give an overview)

Users can specify local variables with the variable key word:

<variablename="color">red</variable>

They can use it within the page like normal variables.

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

Should variables cascade into includes? I'm thinking no, it can be confusing if the user is trying to trace where a variable came from and can't find it. If the user wishes for them to be used they can include it specifically:

<variablename="x">5</variable><include...><spanid="x">{{ x }}</span></include>

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

<variable name="x">5</variable>
{{ x }} // 6
<variable name="x">6</variable>
{{ x }} // 6

I don't think supporting this is a good idea since we won't be able to use nunjucks and would have to write our own parser. Users can use {% set %} as an alternative. Currently a warning is shown if the user tries to reassign a variable.

@damithc

Copy link
Copy Markdown
Contributor

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

should we call them constants instead?

<const name="MAX_SIZE">5</const>

@jamos-tay

jamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
ContributorAuthor

We could, but aren't the global variables kind of like constants too, in that case?

@damithc

Copy link
Copy Markdown
Contributor

We could, but aren't the global variables kind of like constants too, in that case?

At the moment, they are too.

@yamgent

Copy link
Copy Markdown
Member

should we call them constants instead?

<const name="MAX_SIZE">5</const>

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

@acjh

acjh commented Jan 24, 2019

Copy link
Copy Markdown
Contributor

We may also consider implementing overriding the sub-sites' variables in future.

@damithc

Copy link
Copy Markdown
Contributor

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

That's true.

We have several types of variables each behaving in a different way; we should come up with a good terminology to differentiate them.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Sure - maybe we should just leave it as variable for now then since that's how variables.md is named?

@jamos-tayjamos-tay changed the title [WIP] Implement page variable functionalityImplement page variable functionalityJan 28, 2019
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Implemented page variables + included variables, should be ready

Comment threadtest/test_site/_markbind/variables.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threadtest/test_site/testPageVariables.md Outdated
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated, page variables can now cascade into included files.

Page variables are now treated exactly like included variables, global > outer > inner priority etc.. The only difference is how they're defined (span vs variable)

Comment threadtest/test_site/testPageVariablesInInclude.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Update documentation
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated

@yamgentyamgent added this to the v1.17.2 milestone Feb 2, 2019
@yamgent
yamgent merged commit 6e2ea26 into MarkBind:masterFeb 4, 2019
@damithc

Copy link
Copy Markdown
Contributor

Good work on this feature @jamos-tay (and @yamgent, @acjh). I've started using it and worked great so far. What do you guys think of allowing the reuse context to access page variables using the # operator?

e.g., <include src="foo.md#title"/> (where title is a page variable in foo.md)

@acjh

acjh commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

Yes. a variable is like a hidden fragment, right? Of course name clashes is a concern but in that case we can follow the same rules as multiple segments with same ID?

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm... I think that implementation might have a few unwanted implications.

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

Accessing a variable value from the parent doesn't mean the variable is raised to the level of the parent. It's simply reading the value only.

I was hoping to use variables as properties of the page. e.g., title, summary, level, difficulty etc. Similar to a public varaible of a Java object, it makes sense to be able to access properties of the object from outside.

Of course, I can use <span id="title" class="d-none">abc</span> instead. Using variables is slightly more convenient.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm okay, that seems reasonable

It would have to be treated separately from a regular include, though

@damithc

Copy link
Copy Markdown
Contributor

Moved the discussion to #682

@ang-zeyuang-zeyu mentioned this pull request Sep 13, 2020
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.

Allow declaration of variable values in the same source file

4 participants

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

Implement page variable functionality - #627

Merged
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables
Feb 4, 2019
Merged

Implement page variable functionality#627
yamgent merged 9 commits into
MarkBind:masterfrom
jamos-tay:page-local-variables

Conversation

@jamos-tay

@jamos-tayjamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
Contributor

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

• [X] Enhancement to an existing feature

Fixes#575

What is the rationale for this request?

Extension of included variable functionality, allow users to specify local variables within the same page.

What changes did you make? (Give an overview)

Users can specify local variables with the variable key word:

<variablename="color">red</variable>

They can use it within the page like normal variables.

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

Should variables cascade into includes? I'm thinking no, it can be confusing if the user is trying to trace where a variable came from and can't find it. If the user wishes for them to be used they can include it specifically:

<variablename="x">5</variable><include...><spanid="x">{{ x }}</span></include>

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

<variable name="x">5</variable>
{{ x }} // 6
<variable name="x">6</variable>
{{ x }} // 6

I don't think supporting this is a good idea since we won't be able to use nunjucks and would have to write our own parser. Users can use {% set %} as an alternative. Currently a warning is shown if the user tries to reassign a variable.

@damithc

Copy link
Copy Markdown
Contributor

All page variables are processed before any rendering is done, so users cannot change the value of variables mid page:

should we call them constants instead?

<const name="MAX_SIZE">5</const>

@jamos-tay

jamos-tay commented Jan 23, 2019

Copy link
Copy Markdown
ContributorAuthor

We could, but aren't the global variables kind of like constants too, in that case?

@damithc

Copy link
Copy Markdown
Contributor

We could, but aren't the global variables kind of like constants too, in that case?

At the moment, they are too.

@yamgent

Copy link
Copy Markdown
Member

should we call them constants instead?

<const name="MAX_SIZE">5</const>

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

@acjh

acjh commented Jan 24, 2019

Copy link
Copy Markdown
Contributor

We may also consider implementing overriding the sub-sites' variables in future.

@damithc

Copy link
Copy Markdown
Contributor

But if the users can do a {% set %} on them, then it is confusing to call them constants? :P

That's true.

We have several types of variables each behaving in a different way; we should come up with a good terminology to differentiate them.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Sure - maybe we should just leave it as variable for now then since that's how variables.md is named?

@jamos-tayjamos-tay changed the title [WIP] Implement page variable functionalityImplement page variable functionalityJan 28, 2019
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Implemented page variables + included variables, should be ready

Comment threadtest/test_site/_markbind/variables.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Comment threadtest/test_site/testPageVariables.md Outdated
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated, page variables can now cascade into included files.

Page variables are now treated exactly like included variables, global > outer > inner priority etc.. The only difference is how they're defined (span vs variable)

Comment threadtest/test_site/testPageVariablesInInclude.md Outdated
Comment threaddocs/userGuide/reusingContents.md Outdated
Update documentation
@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Updated

@yamgentyamgent added this to the v1.17.2 milestone Feb 2, 2019
@yamgent
yamgent merged commit 6e2ea26 into MarkBind:masterFeb 4, 2019
@damithc

Copy link
Copy Markdown
Contributor

Good work on this feature @jamos-tay (and @yamgent, @acjh). I've started using it and worked great so far. What do you guys think of allowing the reuse context to access page variables using the # operator?

e.g., <include src="foo.md#title"/> (where title is a page variable in foo.md)

@acjh

acjh commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

Isn't that the syntax for fragments?

Yes. a variable is like a hidden fragment, right? Of course name clashes is a concern but in that case we can follow the same rules as multiple segments with same ID?

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm... I think that implementation might have a few unwanted implications.

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

@damithc

damithc commented Feb 4, 2019

Copy link
Copy Markdown
Contributor

For example, if the reasoning is <include src="foo.md#title"/> renders <variable name="title"> fragment in the parent page and therefore title should apply to the parent page, then wouldn't <include src="foo.md"/> render all the variables in foo.md in the parent page and thus all inner variables should be applied? Which seems to be a case of an inner page modifying an outer page's content, which might go against what we want.

Accessing a variable value from the parent doesn't mean the variable is raised to the level of the parent. It's simply reading the value only.

I was hoping to use variables as properties of the page. e.g., title, summary, level, difficulty etc. Similar to a public varaible of a Java object, it makes sense to be able to access properties of the object from outside.

Of course, I can use <span id="title" class="d-none">abc</span> instead. Using variables is slightly more convenient.

@jamos-tay

Copy link
Copy Markdown
ContributorAuthor

Hmm okay, that seems reasonable

It would have to be treated separately from a regular include, though

@damithc

Copy link
Copy Markdown
Contributor

Moved the discussion to #682

@ang-zeyuang-zeyu mentioned this pull request Sep 13, 2020
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.

Allow declaration of variable values in the same source file

4 participants

@jamos-tay@damithc@yamgent@acjh