Skip to content

Allow live reloading for plugin defined sources - #955

Merged
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml
Dec 23, 2019
Merged

Allow live reloading for plugin defined sources#955
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml

Conversation

@ang-zeyu

@ang-zeyuang-zeyu commented Dec 15, 2019

Copy link
Copy Markdown
Contributor

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

• [x] Documentation update
• [x] Enhancement to an existing feature

Resolves#913

What is the rationale for this request?
To allow plugins to define their own source file types and corresponding
source files that will be watched and updated by the live preview appropriately.

What changes did you make? (Give an overview)

  • Plugins can a new attribute in its exports: getSources
    • getSources: Allows plugins to return an array of source file paths to watch
  • Similar to Page.prototype.preRender, Page.prototype.getSources runs getSources all plugins just before
    preRender.
  • Updated relavant test files

Provide some example code that this change will affect:

(Plantumlpluginfile)module.exports={
...,getSources: (content)=>{// Add all src attributes in <puml> tags to watch listconst$=cheerio.load(content,{xmlMode: true});return$('puml').map((i,tag)=>tag.attribs.src).get();},

Is there anything you'd like reviewers to focus on?
Whether a callback style solution would be better ( a 5th parameter to preRender / postRender that contains callbacks plugins can use ), since in the long run one may find plugins requiring more and more functionality.

Testing instructions:
I added a <puml> tag, and an <include> tag ( including testPlantUML.md )
to the test site. Changing any of the source files ( e.g. activity.puml ) should
cause the affected pages to reload when serving the page.

Proposed commit message: (wrap lines at 72 characters)
Allow live reloading for plugin defined sources

This allows plugins to define a custom list of source files and file
types for the page to be watched, allowing live reload to rebuild
the affected page.

Comment threadsrc/Page.js Outdated
if (plugin.getSources) {
const sources = _.castArray(
plugin.getSources(content, this.pluginsContext[pluginName] || {},
this.frontMatter, this.getPluginConfig()));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why _.castArray? getSources should return an array.

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.

So that a single source file could be returned as well,
should I enforce returning an array instead?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Yes, since getSources is plural.

@ang-zeyu
ang-zeyuforce-pushed the watch-puml branch 2 times, most recently from 5dd6389 to 720648bCompareDecember 15, 2019 14:47
@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated getSources to require returning array instead as per method naming

@yamgent
yamgent self-requested a review December 16, 2019 03:50
@ang-zeyuang-zeyu changed the title [WIP] Allow live reloading for plugin defined sourcesAllow live reloading for plugin defined sourcesDec 16, 2019

@yamgentyamgent left a comment

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 good implementation-wise, comments are mostly about wordings:

Comment threaddocs/userGuide/usingPlugins.md Outdated
const $ = cheerio.load(content, { xmlMode: true });

return $('puml').map((i, tag) => tag.attribs.src).get();
},

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.

The indentation of the method body is off. Only the comment line was in the correct indentation

Comment threaddocs/userGuide/usingPlugins.md Outdated
During the `preRender` and `postRender` stages however, plugins may do custom processing using some other
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.

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.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin. implement the ``getSources`` method:

Prefer being more direct in documentations so that it is easier for the reader to process.

Comment threaddocs/userGuide/usingPlugins.md Outdated

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.
- `content`: The raw Markdown of any Markdown file (`.md`, `.mbd`, etc.).

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.

any -> the current? The use of "any" makes it seems like this call is not tied to any pages.

Comment threaddocs/userGuide/usingPlugins.md Outdated
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.

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.

Returns an array of source file paths to watch. Called before a Markdown file'spreRender function is called.

Comment threadsrc/Page.js Outdated
};

/**
* Collect page sources provided by plugins

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 a bit wrong to say "page sources", since puml files are not really pages? Maybe "file sources"?

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Hi, thanks for looking through it! I've updated the relavant lines.

On another note, I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

@yamgent

Copy link
Copy Markdown
Member

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated, will squash if its fine!

@acjh

acjh commented Dec 18, 2019

Copy link
Copy Markdown
Contributor

I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

Actually, it was intentionally undocumented by @jamos-tay as of #714 (comment):

I needed access to Page.headingIndexingLevel, so I added a 4th parameter, page which is the Page object itself... Other plugins might need access to page config so this could be helpful

I'm thinking we can use this for internal plugins, but don't document it in user docs, since we don't want to expose authors to the implementation

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Actually, it was intentionally undocumented by @jamos-tay as of [#714 (comment)]

Thanks for the heads up!

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. Regarding the original concern for the change ( passing the entire Page being dangerous ), I could include a warning in the docs about includedFiles since it is used in Site.proto.updateSiteData(). Still, its a subsection to add into the docs which means more details for the user to read. Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

What's the take on this? 😮

@acjh

acjh commented Dec 19, 2019

Copy link
Copy Markdown
Contributor

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. ... Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

The concern isn't that it is tedious to document. Rather, ideally, plugins should purely process content rather than use variables from and depend on the (filesystem-aware) implementation of Markbind CLI.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Noted on the intended usage of plugins. Thanks!

Reverted the 'documentation updates' and squashed

@yamgent
yamgent merged commit 211cd6e into MarkBind:masterDec 23, 2019
@yamgentyamgent added this to the v2.7.1 milestone Dec 23, 2019
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 live-preview for .puml files

3 participants

@ang-zeyu@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" + '
Allow live reloading for plugin defined sources by ang-zeyu · Pull Request #955 · MarkBind/markbind · GitHub
Skip to content

Allow live reloading for plugin defined sources - #955

Merged
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml
Dec 23, 2019
Merged

Allow live reloading for plugin defined sources#955
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml

Conversation

@ang-zeyu

@ang-zeyuang-zeyu commented Dec 15, 2019

Copy link
Copy Markdown
Contributor

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

• [x] Documentation update
• [x] Enhancement to an existing feature

Resolves#913

What is the rationale for this request?
To allow plugins to define their own source file types and corresponding
source files that will be watched and updated by the live preview appropriately.

What changes did you make? (Give an overview)

  • Plugins can a new attribute in its exports: getSources
    • getSources: Allows plugins to return an array of source file paths to watch
  • Similar to Page.prototype.preRender, Page.prototype.getSources runs getSources all plugins just before
    preRender.
  • Updated relavant test files

Provide some example code that this change will affect:

(Plantumlpluginfile)module.exports={
...,getSources: (content)=>{// Add all src attributes in <puml> tags to watch listconst$=cheerio.load(content,{xmlMode: true});return$('puml').map((i,tag)=>tag.attribs.src).get();},

Is there anything you'd like reviewers to focus on?
Whether a callback style solution would be better ( a 5th parameter to preRender / postRender that contains callbacks plugins can use ), since in the long run one may find plugins requiring more and more functionality.

Testing instructions:
I added a <puml> tag, and an <include> tag ( including testPlantUML.md )
to the test site. Changing any of the source files ( e.g. activity.puml ) should
cause the affected pages to reload when serving the page.

Proposed commit message: (wrap lines at 72 characters)
Allow live reloading for plugin defined sources

This allows plugins to define a custom list of source files and file
types for the page to be watched, allowing live reload to rebuild
the affected page.

Comment threadsrc/Page.js Outdated
if (plugin.getSources) {
const sources = _.castArray(
plugin.getSources(content, this.pluginsContext[pluginName] || {},
this.frontMatter, this.getPluginConfig()));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why _.castArray? getSources should return an array.

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.

So that a single source file could be returned as well,
should I enforce returning an array instead?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Yes, since getSources is plural.

@ang-zeyu
ang-zeyuforce-pushed the watch-puml branch 2 times, most recently from 5dd6389 to 720648bCompareDecember 15, 2019 14:47
@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated getSources to require returning array instead as per method naming

@yamgent
yamgent self-requested a review December 16, 2019 03:50
@ang-zeyuang-zeyu changed the title [WIP] Allow live reloading for plugin defined sourcesAllow live reloading for plugin defined sourcesDec 16, 2019

@yamgentyamgent left a comment

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 good implementation-wise, comments are mostly about wordings:

Comment threaddocs/userGuide/usingPlugins.md Outdated
const $ = cheerio.load(content, { xmlMode: true });

return $('puml').map((i, tag) => tag.attribs.src).get();
},

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.

The indentation of the method body is off. Only the comment line was in the correct indentation

Comment threaddocs/userGuide/usingPlugins.md Outdated
During the `preRender` and `postRender` stages however, plugins may do custom processing using some other
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.

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.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin. implement the ``getSources`` method:

Prefer being more direct in documentations so that it is easier for the reader to process.

Comment threaddocs/userGuide/usingPlugins.md Outdated

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.
- `content`: The raw Markdown of any Markdown file (`.md`, `.mbd`, etc.).

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.

any -> the current? The use of "any" makes it seems like this call is not tied to any pages.

Comment threaddocs/userGuide/usingPlugins.md Outdated
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.

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.

Returns an array of source file paths to watch. Called before a Markdown file'spreRender function is called.

Comment threadsrc/Page.js Outdated
};

/**
* Collect page sources provided by plugins

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 a bit wrong to say "page sources", since puml files are not really pages? Maybe "file sources"?

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Hi, thanks for looking through it! I've updated the relavant lines.

On another note, I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

@yamgent

Copy link
Copy Markdown
Member

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated, will squash if its fine!

@acjh

acjh commented Dec 18, 2019

Copy link
Copy Markdown
Contributor

I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

Actually, it was intentionally undocumented by @jamos-tay as of #714 (comment):

I needed access to Page.headingIndexingLevel, so I added a 4th parameter, page which is the Page object itself... Other plugins might need access to page config so this could be helpful

I'm thinking we can use this for internal plugins, but don't document it in user docs, since we don't want to expose authors to the implementation

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Actually, it was intentionally undocumented by @jamos-tay as of [#714 (comment)]

Thanks for the heads up!

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. Regarding the original concern for the change ( passing the entire Page being dangerous ), I could include a warning in the docs about includedFiles since it is used in Site.proto.updateSiteData(). Still, its a subsection to add into the docs which means more details for the user to read. Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

What's the take on this? 😮

@acjh

acjh commented Dec 19, 2019

Copy link
Copy Markdown
Contributor

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. ... Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

The concern isn't that it is tedious to document. Rather, ideally, plugins should purely process content rather than use variables from and depend on the (filesystem-aware) implementation of Markbind CLI.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Noted on the intended usage of plugins. Thanks!

Reverted the 'documentation updates' and squashed

@yamgent
yamgent merged commit 211cd6e into MarkBind:masterDec 23, 2019
@yamgentyamgent added this to the v2.7.1 milestone Dec 23, 2019
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 live-preview for .puml files

3 participants

@ang-zeyu@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('^' + ".*" + ' Allow live reloading for plugin defined sources by ang-zeyu · Pull Request #955 · MarkBind/markbind · GitHub
Skip to content

Allow live reloading for plugin defined sources - #955

Merged
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml
Dec 23, 2019
Merged

Allow live reloading for plugin defined sources#955
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml

Conversation

@ang-zeyu

@ang-zeyuang-zeyu commented Dec 15, 2019

Copy link
Copy Markdown
Contributor

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

• [x] Documentation update
• [x] Enhancement to an existing feature

Resolves#913

What is the rationale for this request?
To allow plugins to define their own source file types and corresponding
source files that will be watched and updated by the live preview appropriately.

What changes did you make? (Give an overview)

  • Plugins can a new attribute in its exports: getSources
    • getSources: Allows plugins to return an array of source file paths to watch
  • Similar to Page.prototype.preRender, Page.prototype.getSources runs getSources all plugins just before
    preRender.
  • Updated relavant test files

Provide some example code that this change will affect:

(Plantumlpluginfile)module.exports={
...,getSources: (content)=>{// Add all src attributes in <puml> tags to watch listconst$=cheerio.load(content,{xmlMode: true});return$('puml').map((i,tag)=>tag.attribs.src).get();},

Is there anything you'd like reviewers to focus on?
Whether a callback style solution would be better ( a 5th parameter to preRender / postRender that contains callbacks plugins can use ), since in the long run one may find plugins requiring more and more functionality.

Testing instructions:
I added a <puml> tag, and an <include> tag ( including testPlantUML.md )
to the test site. Changing any of the source files ( e.g. activity.puml ) should
cause the affected pages to reload when serving the page.

Proposed commit message: (wrap lines at 72 characters)
Allow live reloading for plugin defined sources

This allows plugins to define a custom list of source files and file
types for the page to be watched, allowing live reload to rebuild
the affected page.

Comment threadsrc/Page.js Outdated
if (plugin.getSources) {
const sources = _.castArray(
plugin.getSources(content, this.pluginsContext[pluginName] || {},
this.frontMatter, this.getPluginConfig()));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why _.castArray? getSources should return an array.

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.

So that a single source file could be returned as well,
should I enforce returning an array instead?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Yes, since getSources is plural.

@ang-zeyu
ang-zeyuforce-pushed the watch-puml branch 2 times, most recently from 5dd6389 to 720648bCompareDecember 15, 2019 14:47
@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated getSources to require returning array instead as per method naming

@yamgent
yamgent self-requested a review December 16, 2019 03:50
@ang-zeyuang-zeyu changed the title [WIP] Allow live reloading for plugin defined sourcesAllow live reloading for plugin defined sourcesDec 16, 2019

@yamgentyamgent left a comment

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 good implementation-wise, comments are mostly about wordings:

Comment threaddocs/userGuide/usingPlugins.md Outdated
const $ = cheerio.load(content, { xmlMode: true });

return $('puml').map((i, tag) => tag.attribs.src).get();
},

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.

The indentation of the method body is off. Only the comment line was in the correct indentation

Comment threaddocs/userGuide/usingPlugins.md Outdated
During the `preRender` and `postRender` stages however, plugins may do custom processing using some other
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.

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.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin. implement the ``getSources`` method:

Prefer being more direct in documentations so that it is easier for the reader to process.

Comment threaddocs/userGuide/usingPlugins.md Outdated

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.
- `content`: The raw Markdown of any Markdown file (`.md`, `.mbd`, etc.).

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.

any -> the current? The use of "any" makes it seems like this call is not tied to any pages.

Comment threaddocs/userGuide/usingPlugins.md Outdated
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.

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.

Returns an array of source file paths to watch. Called before a Markdown file'spreRender function is called.

Comment threadsrc/Page.js Outdated
};

/**
* Collect page sources provided by plugins

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 a bit wrong to say "page sources", since puml files are not really pages? Maybe "file sources"?

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Hi, thanks for looking through it! I've updated the relavant lines.

On another note, I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

@yamgent

Copy link
Copy Markdown
Member

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated, will squash if its fine!

@acjh

acjh commented Dec 18, 2019

Copy link
Copy Markdown
Contributor

I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

Actually, it was intentionally undocumented by @jamos-tay as of #714 (comment):

I needed access to Page.headingIndexingLevel, so I added a 4th parameter, page which is the Page object itself... Other plugins might need access to page config so this could be helpful

I'm thinking we can use this for internal plugins, but don't document it in user docs, since we don't want to expose authors to the implementation

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Actually, it was intentionally undocumented by @jamos-tay as of [#714 (comment)]

Thanks for the heads up!

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. Regarding the original concern for the change ( passing the entire Page being dangerous ), I could include a warning in the docs about includedFiles since it is used in Site.proto.updateSiteData(). Still, its a subsection to add into the docs which means more details for the user to read. Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

What's the take on this? 😮

@acjh

acjh commented Dec 19, 2019

Copy link
Copy Markdown
Contributor

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. ... Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

The concern isn't that it is tedious to document. Rather, ideally, plugins should purely process content rather than use variables from and depend on the (filesystem-aware) implementation of Markbind CLI.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Noted on the intended usage of plugins. Thanks!

Reverted the 'documentation updates' and squashed

@yamgent
yamgent merged commit 211cd6e into MarkBind:masterDec 23, 2019
@yamgentyamgent added this to the v2.7.1 milestone Dec 23, 2019
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 live-preview for .puml files

3 participants

@ang-zeyu@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('^' + ".*" + ' Allow live reloading for plugin defined sources by ang-zeyu · Pull Request #955 · MarkBind/markbind · GitHub
Skip to content

Allow live reloading for plugin defined sources - #955

Merged
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml
Dec 23, 2019
Merged

Allow live reloading for plugin defined sources#955
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml

Conversation

@ang-zeyu

@ang-zeyuang-zeyu commented Dec 15, 2019

Copy link
Copy Markdown
Contributor

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

• [x] Documentation update
• [x] Enhancement to an existing feature

Resolves#913

What is the rationale for this request?
To allow plugins to define their own source file types and corresponding
source files that will be watched and updated by the live preview appropriately.

What changes did you make? (Give an overview)

  • Plugins can a new attribute in its exports: getSources
    • getSources: Allows plugins to return an array of source file paths to watch
  • Similar to Page.prototype.preRender, Page.prototype.getSources runs getSources all plugins just before
    preRender.
  • Updated relavant test files

Provide some example code that this change will affect:

(Plantumlpluginfile)module.exports={
...,getSources: (content)=>{// Add all src attributes in <puml> tags to watch listconst$=cheerio.load(content,{xmlMode: true});return$('puml').map((i,tag)=>tag.attribs.src).get();},

Is there anything you'd like reviewers to focus on?
Whether a callback style solution would be better ( a 5th parameter to preRender / postRender that contains callbacks plugins can use ), since in the long run one may find plugins requiring more and more functionality.

Testing instructions:
I added a <puml> tag, and an <include> tag ( including testPlantUML.md )
to the test site. Changing any of the source files ( e.g. activity.puml ) should
cause the affected pages to reload when serving the page.

Proposed commit message: (wrap lines at 72 characters)
Allow live reloading for plugin defined sources

This allows plugins to define a custom list of source files and file
types for the page to be watched, allowing live reload to rebuild
the affected page.

Comment threadsrc/Page.js Outdated
if (plugin.getSources) {
const sources = _.castArray(
plugin.getSources(content, this.pluginsContext[pluginName] || {},
this.frontMatter, this.getPluginConfig()));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why _.castArray? getSources should return an array.

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.

So that a single source file could be returned as well,
should I enforce returning an array instead?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Yes, since getSources is plural.

@ang-zeyu
ang-zeyuforce-pushed the watch-puml branch 2 times, most recently from 5dd6389 to 720648bCompareDecember 15, 2019 14:47
@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated getSources to require returning array instead as per method naming

@yamgent
yamgent self-requested a review December 16, 2019 03:50
@ang-zeyuang-zeyu changed the title [WIP] Allow live reloading for plugin defined sourcesAllow live reloading for plugin defined sourcesDec 16, 2019

@yamgentyamgent left a comment

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 good implementation-wise, comments are mostly about wordings:

Comment threaddocs/userGuide/usingPlugins.md Outdated
const $ = cheerio.load(content, { xmlMode: true });

return $('puml').map((i, tag) => tag.attribs.src).get();
},

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.

The indentation of the method body is off. Only the comment line was in the correct indentation

Comment threaddocs/userGuide/usingPlugins.md Outdated
During the `preRender` and `postRender` stages however, plugins may do custom processing using some other
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.

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.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin. implement the ``getSources`` method:

Prefer being more direct in documentations so that it is easier for the reader to process.

Comment threaddocs/userGuide/usingPlugins.md Outdated

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.
- `content`: The raw Markdown of any Markdown file (`.md`, `.mbd`, etc.).

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.

any -> the current? The use of "any" makes it seems like this call is not tied to any pages.

Comment threaddocs/userGuide/usingPlugins.md Outdated
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.

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.

Returns an array of source file paths to watch. Called before a Markdown file'spreRender function is called.

Comment threadsrc/Page.js Outdated
};

/**
* Collect page sources provided by plugins

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 a bit wrong to say "page sources", since puml files are not really pages? Maybe "file sources"?

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Hi, thanks for looking through it! I've updated the relavant lines.

On another note, I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

@yamgent

Copy link
Copy Markdown
Member

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated, will squash if its fine!

@acjh

acjh commented Dec 18, 2019

Copy link
Copy Markdown
Contributor

I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

Actually, it was intentionally undocumented by @jamos-tay as of #714 (comment):

I needed access to Page.headingIndexingLevel, so I added a 4th parameter, page which is the Page object itself... Other plugins might need access to page config so this could be helpful

I'm thinking we can use this for internal plugins, but don't document it in user docs, since we don't want to expose authors to the implementation

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Actually, it was intentionally undocumented by @jamos-tay as of [#714 (comment)]

Thanks for the heads up!

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. Regarding the original concern for the change ( passing the entire Page being dangerous ), I could include a warning in the docs about includedFiles since it is used in Site.proto.updateSiteData(). Still, its a subsection to add into the docs which means more details for the user to read. Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

What's the take on this? 😮

@acjh

acjh commented Dec 19, 2019

Copy link
Copy Markdown
Contributor

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. ... Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

The concern isn't that it is tedious to document. Rather, ideally, plugins should purely process content rather than use variables from and depend on the (filesystem-aware) implementation of Markbind CLI.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Noted on the intended usage of plugins. Thanks!

Reverted the 'documentation updates' and squashed

@yamgent
yamgent merged commit 211cd6e into MarkBind:masterDec 23, 2019
@yamgentyamgent added this to the v2.7.1 milestone Dec 23, 2019
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 live-preview for .puml files

3 participants

@ang-zeyu@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" + ' Allow live reloading for plugin defined sources by ang-zeyu · Pull Request #955 · MarkBind/markbind · GitHub
Skip to content

Allow live reloading for plugin defined sources - #955

Merged
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml
Dec 23, 2019
Merged

Allow live reloading for plugin defined sources#955
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml

Conversation

@ang-zeyu

@ang-zeyuang-zeyu commented Dec 15, 2019

Copy link
Copy Markdown
Contributor

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

• [x] Documentation update
• [x] Enhancement to an existing feature

Resolves#913

What is the rationale for this request?
To allow plugins to define their own source file types and corresponding
source files that will be watched and updated by the live preview appropriately.

What changes did you make? (Give an overview)

  • Plugins can a new attribute in its exports: getSources
    • getSources: Allows plugins to return an array of source file paths to watch
  • Similar to Page.prototype.preRender, Page.prototype.getSources runs getSources all plugins just before
    preRender.
  • Updated relavant test files

Provide some example code that this change will affect:

(Plantumlpluginfile)module.exports={
...,getSources: (content)=>{// Add all src attributes in <puml> tags to watch listconst$=cheerio.load(content,{xmlMode: true});return$('puml').map((i,tag)=>tag.attribs.src).get();},

Is there anything you'd like reviewers to focus on?
Whether a callback style solution would be better ( a 5th parameter to preRender / postRender that contains callbacks plugins can use ), since in the long run one may find plugins requiring more and more functionality.

Testing instructions:
I added a <puml> tag, and an <include> tag ( including testPlantUML.md )
to the test site. Changing any of the source files ( e.g. activity.puml ) should
cause the affected pages to reload when serving the page.

Proposed commit message: (wrap lines at 72 characters)
Allow live reloading for plugin defined sources

This allows plugins to define a custom list of source files and file
types for the page to be watched, allowing live reload to rebuild
the affected page.

Comment threadsrc/Page.js Outdated
if (plugin.getSources) {
const sources = _.castArray(
plugin.getSources(content, this.pluginsContext[pluginName] || {},
this.frontMatter, this.getPluginConfig()));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why _.castArray? getSources should return an array.

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.

So that a single source file could be returned as well,
should I enforce returning an array instead?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Yes, since getSources is plural.

@ang-zeyu
ang-zeyuforce-pushed the watch-puml branch 2 times, most recently from 5dd6389 to 720648bCompareDecember 15, 2019 14:47
@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated getSources to require returning array instead as per method naming

@yamgent
yamgent self-requested a review December 16, 2019 03:50
@ang-zeyuang-zeyu changed the title [WIP] Allow live reloading for plugin defined sourcesAllow live reloading for plugin defined sourcesDec 16, 2019

@yamgentyamgent left a comment

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 good implementation-wise, comments are mostly about wordings:

Comment threaddocs/userGuide/usingPlugins.md Outdated
const $ = cheerio.load(content, { xmlMode: true });

return $('puml').map((i, tag) => tag.attribs.src).get();
},

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.

The indentation of the method body is off. Only the comment line was in the correct indentation

Comment threaddocs/userGuide/usingPlugins.md Outdated
During the `preRender` and `postRender` stages however, plugins may do custom processing using some other
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.

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.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin. implement the ``getSources`` method:

Prefer being more direct in documentations so that it is easier for the reader to process.

Comment threaddocs/userGuide/usingPlugins.md Outdated

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.
- `content`: The raw Markdown of any Markdown file (`.md`, `.mbd`, etc.).

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.

any -> the current? The use of "any" makes it seems like this call is not tied to any pages.

Comment threaddocs/userGuide/usingPlugins.md Outdated
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.

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.

Returns an array of source file paths to watch. Called before a Markdown file'spreRender function is called.

Comment threadsrc/Page.js Outdated
};

/**
* Collect page sources provided by plugins

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 a bit wrong to say "page sources", since puml files are not really pages? Maybe "file sources"?

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Hi, thanks for looking through it! I've updated the relavant lines.

On another note, I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

@yamgent

Copy link
Copy Markdown
Member

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated, will squash if its fine!

@acjh

acjh commented Dec 18, 2019

Copy link
Copy Markdown
Contributor

I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

Actually, it was intentionally undocumented by @jamos-tay as of #714 (comment):

I needed access to Page.headingIndexingLevel, so I added a 4th parameter, page which is the Page object itself... Other plugins might need access to page config so this could be helpful

I'm thinking we can use this for internal plugins, but don't document it in user docs, since we don't want to expose authors to the implementation

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Actually, it was intentionally undocumented by @jamos-tay as of [#714 (comment)]

Thanks for the heads up!

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. Regarding the original concern for the change ( passing the entire Page being dangerous ), I could include a warning in the docs about includedFiles since it is used in Site.proto.updateSiteData(). Still, its a subsection to add into the docs which means more details for the user to read. Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

What's the take on this? 😮

@acjh

acjh commented Dec 19, 2019

Copy link
Copy Markdown
Contributor

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. ... Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

The concern isn't that it is tedious to document. Rather, ideally, plugins should purely process content rather than use variables from and depend on the (filesystem-aware) implementation of Markbind CLI.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Noted on the intended usage of plugins. Thanks!

Reverted the 'documentation updates' and squashed

@yamgent
yamgent merged commit 211cd6e into MarkBind:masterDec 23, 2019
@yamgentyamgent added this to the v2.7.1 milestone Dec 23, 2019
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 live-preview for .puml files

3 participants

@ang-zeyu@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('^' + ".*" + ' Allow live reloading for plugin defined sources by ang-zeyu · Pull Request #955 · MarkBind/markbind · GitHub
Skip to content

Allow live reloading for plugin defined sources - #955

Merged
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml
Dec 23, 2019
Merged

Allow live reloading for plugin defined sources#955
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml

Conversation

@ang-zeyu

@ang-zeyuang-zeyu commented Dec 15, 2019

Copy link
Copy Markdown
Contributor

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

• [x] Documentation update
• [x] Enhancement to an existing feature

Resolves#913

What is the rationale for this request?
To allow plugins to define their own source file types and corresponding
source files that will be watched and updated by the live preview appropriately.

What changes did you make? (Give an overview)

  • Plugins can a new attribute in its exports: getSources
    • getSources: Allows plugins to return an array of source file paths to watch
  • Similar to Page.prototype.preRender, Page.prototype.getSources runs getSources all plugins just before
    preRender.
  • Updated relavant test files

Provide some example code that this change will affect:

(Plantumlpluginfile)module.exports={
...,getSources: (content)=>{// Add all src attributes in <puml> tags to watch listconst$=cheerio.load(content,{xmlMode: true});return$('puml').map((i,tag)=>tag.attribs.src).get();},

Is there anything you'd like reviewers to focus on?
Whether a callback style solution would be better ( a 5th parameter to preRender / postRender that contains callbacks plugins can use ), since in the long run one may find plugins requiring more and more functionality.

Testing instructions:
I added a <puml> tag, and an <include> tag ( including testPlantUML.md )
to the test site. Changing any of the source files ( e.g. activity.puml ) should
cause the affected pages to reload when serving the page.

Proposed commit message: (wrap lines at 72 characters)
Allow live reloading for plugin defined sources

This allows plugins to define a custom list of source files and file
types for the page to be watched, allowing live reload to rebuild
the affected page.

Comment threadsrc/Page.js Outdated
if (plugin.getSources) {
const sources = _.castArray(
plugin.getSources(content, this.pluginsContext[pluginName] || {},
this.frontMatter, this.getPluginConfig()));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why _.castArray? getSources should return an array.

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.

So that a single source file could be returned as well,
should I enforce returning an array instead?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Yes, since getSources is plural.

@ang-zeyu
ang-zeyuforce-pushed the watch-puml branch 2 times, most recently from 5dd6389 to 720648bCompareDecember 15, 2019 14:47
@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated getSources to require returning array instead as per method naming

@yamgent
yamgent self-requested a review December 16, 2019 03:50
@ang-zeyuang-zeyu changed the title [WIP] Allow live reloading for plugin defined sourcesAllow live reloading for plugin defined sourcesDec 16, 2019

@yamgentyamgent left a comment

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 good implementation-wise, comments are mostly about wordings:

Comment threaddocs/userGuide/usingPlugins.md Outdated
const $ = cheerio.load(content, { xmlMode: true });

return $('puml').map((i, tag) => tag.attribs.src).get();
},

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.

The indentation of the method body is off. Only the comment line was in the correct indentation

Comment threaddocs/userGuide/usingPlugins.md Outdated
During the `preRender` and `postRender` stages however, plugins may do custom processing using some other
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.

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.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin. implement the ``getSources`` method:

Prefer being more direct in documentations so that it is easier for the reader to process.

Comment threaddocs/userGuide/usingPlugins.md Outdated

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.
- `content`: The raw Markdown of any Markdown file (`.md`, `.mbd`, etc.).

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.

any -> the current? The use of "any" makes it seems like this call is not tied to any pages.

Comment threaddocs/userGuide/usingPlugins.md Outdated
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.

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.

Returns an array of source file paths to watch. Called before a Markdown file'spreRender function is called.

Comment threadsrc/Page.js Outdated
};

/**
* Collect page sources provided by plugins

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 a bit wrong to say "page sources", since puml files are not really pages? Maybe "file sources"?

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Hi, thanks for looking through it! I've updated the relavant lines.

On another note, I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

@yamgent

Copy link
Copy Markdown
Member

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated, will squash if its fine!

@acjh

acjh commented Dec 18, 2019

Copy link
Copy Markdown
Contributor

I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

Actually, it was intentionally undocumented by @jamos-tay as of #714 (comment):

I needed access to Page.headingIndexingLevel, so I added a 4th parameter, page which is the Page object itself... Other plugins might need access to page config so this could be helpful

I'm thinking we can use this for internal plugins, but don't document it in user docs, since we don't want to expose authors to the implementation

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Actually, it was intentionally undocumented by @jamos-tay as of [#714 (comment)]

Thanks for the heads up!

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. Regarding the original concern for the change ( passing the entire Page being dangerous ), I could include a warning in the docs about includedFiles since it is used in Site.proto.updateSiteData(). Still, its a subsection to add into the docs which means more details for the user to read. Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

What's the take on this? 😮

@acjh

acjh commented Dec 19, 2019

Copy link
Copy Markdown
Contributor

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. ... Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

The concern isn't that it is tedious to document. Rather, ideally, plugins should purely process content rather than use variables from and depend on the (filesystem-aware) implementation of Markbind CLI.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Noted on the intended usage of plugins. Thanks!

Reverted the 'documentation updates' and squashed

@yamgent
yamgent merged commit 211cd6e into MarkBind:masterDec 23, 2019
@yamgentyamgent added this to the v2.7.1 milestone Dec 23, 2019
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 live-preview for .puml files

3 participants

@ang-zeyu@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('^' + ".*" + ' Allow live reloading for plugin defined sources by ang-zeyu · Pull Request #955 · MarkBind/markbind · GitHub
Skip to content

Allow live reloading for plugin defined sources - #955

Merged
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml
Dec 23, 2019
Merged

Allow live reloading for plugin defined sources#955
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml

Conversation

@ang-zeyu

@ang-zeyuang-zeyu commented Dec 15, 2019

Copy link
Copy Markdown
Contributor

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

• [x] Documentation update
• [x] Enhancement to an existing feature

Resolves#913

What is the rationale for this request?
To allow plugins to define their own source file types and corresponding
source files that will be watched and updated by the live preview appropriately.

What changes did you make? (Give an overview)

  • Plugins can a new attribute in its exports: getSources
    • getSources: Allows plugins to return an array of source file paths to watch
  • Similar to Page.prototype.preRender, Page.prototype.getSources runs getSources all plugins just before
    preRender.
  • Updated relavant test files

Provide some example code that this change will affect:

(Plantumlpluginfile)module.exports={
...,getSources: (content)=>{// Add all src attributes in <puml> tags to watch listconst$=cheerio.load(content,{xmlMode: true});return$('puml').map((i,tag)=>tag.attribs.src).get();},

Is there anything you'd like reviewers to focus on?
Whether a callback style solution would be better ( a 5th parameter to preRender / postRender that contains callbacks plugins can use ), since in the long run one may find plugins requiring more and more functionality.

Testing instructions:
I added a <puml> tag, and an <include> tag ( including testPlantUML.md )
to the test site. Changing any of the source files ( e.g. activity.puml ) should
cause the affected pages to reload when serving the page.

Proposed commit message: (wrap lines at 72 characters)
Allow live reloading for plugin defined sources

This allows plugins to define a custom list of source files and file
types for the page to be watched, allowing live reload to rebuild
the affected page.

Comment threadsrc/Page.js Outdated
if (plugin.getSources) {
const sources = _.castArray(
plugin.getSources(content, this.pluginsContext[pluginName] || {},
this.frontMatter, this.getPluginConfig()));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why _.castArray? getSources should return an array.

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.

So that a single source file could be returned as well,
should I enforce returning an array instead?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Yes, since getSources is plural.

@ang-zeyu
ang-zeyuforce-pushed the watch-puml branch 2 times, most recently from 5dd6389 to 720648bCompareDecember 15, 2019 14:47
@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated getSources to require returning array instead as per method naming

@yamgent
yamgent self-requested a review December 16, 2019 03:50
@ang-zeyuang-zeyu changed the title [WIP] Allow live reloading for plugin defined sourcesAllow live reloading for plugin defined sourcesDec 16, 2019

@yamgentyamgent left a comment

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 good implementation-wise, comments are mostly about wordings:

Comment threaddocs/userGuide/usingPlugins.md Outdated
const $ = cheerio.load(content, { xmlMode: true });

return $('puml').map((i, tag) => tag.attribs.src).get();
},

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.

The indentation of the method body is off. Only the comment line was in the correct indentation

Comment threaddocs/userGuide/usingPlugins.md Outdated
During the `preRender` and `postRender` stages however, plugins may do custom processing using some other
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.

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.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin. implement the ``getSources`` method:

Prefer being more direct in documentations so that it is easier for the reader to process.

Comment threaddocs/userGuide/usingPlugins.md Outdated

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.
- `content`: The raw Markdown of any Markdown file (`.md`, `.mbd`, etc.).

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.

any -> the current? The use of "any" makes it seems like this call is not tied to any pages.

Comment threaddocs/userGuide/usingPlugins.md Outdated
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.

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.

Returns an array of source file paths to watch. Called before a Markdown file'spreRender function is called.

Comment threadsrc/Page.js Outdated
};

/**
* Collect page sources provided by plugins

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 a bit wrong to say "page sources", since puml files are not really pages? Maybe "file sources"?

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Hi, thanks for looking through it! I've updated the relavant lines.

On another note, I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

@yamgent

Copy link
Copy Markdown
Member

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated, will squash if its fine!

@acjh

acjh commented Dec 18, 2019

Copy link
Copy Markdown
Contributor

I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

Actually, it was intentionally undocumented by @jamos-tay as of #714 (comment):

I needed access to Page.headingIndexingLevel, so I added a 4th parameter, page which is the Page object itself... Other plugins might need access to page config so this could be helpful

I'm thinking we can use this for internal plugins, but don't document it in user docs, since we don't want to expose authors to the implementation

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Actually, it was intentionally undocumented by @jamos-tay as of [#714 (comment)]

Thanks for the heads up!

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. Regarding the original concern for the change ( passing the entire Page being dangerous ), I could include a warning in the docs about includedFiles since it is used in Site.proto.updateSiteData(). Still, its a subsection to add into the docs which means more details for the user to read. Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

What's the take on this? 😮

@acjh

acjh commented Dec 19, 2019

Copy link
Copy Markdown
Contributor

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. ... Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

The concern isn't that it is tedious to document. Rather, ideally, plugins should purely process content rather than use variables from and depend on the (filesystem-aware) implementation of Markbind CLI.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Noted on the intended usage of plugins. Thanks!

Reverted the 'documentation updates' and squashed

@yamgent
yamgent merged commit 211cd6e into MarkBind:masterDec 23, 2019
@yamgentyamgent added this to the v2.7.1 milestone Dec 23, 2019
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 live-preview for .puml files

3 participants

@ang-zeyu@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); } })(); })(); Allow live reloading for plugin defined sources by ang-zeyu · Pull Request #955 · MarkBind/markbind · GitHub
Skip to content

Allow live reloading for plugin defined sources - #955

Merged
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml
Dec 23, 2019
Merged

Allow live reloading for plugin defined sources#955
yamgent merged 1 commit into
MarkBind:masterfrom
ang-zeyu:watch-puml

Conversation

@ang-zeyu

@ang-zeyuang-zeyu commented Dec 15, 2019

Copy link
Copy Markdown
Contributor

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

• [x] Documentation update
• [x] Enhancement to an existing feature

Resolves#913

What is the rationale for this request?
To allow plugins to define their own source file types and corresponding
source files that will be watched and updated by the live preview appropriately.

What changes did you make? (Give an overview)

  • Plugins can a new attribute in its exports: getSources
    • getSources: Allows plugins to return an array of source file paths to watch
  • Similar to Page.prototype.preRender, Page.prototype.getSources runs getSources all plugins just before
    preRender.
  • Updated relavant test files

Provide some example code that this change will affect:

(Plantumlpluginfile)module.exports={
...,getSources: (content)=>{// Add all src attributes in <puml> tags to watch listconst$=cheerio.load(content,{xmlMode: true});return$('puml').map((i,tag)=>tag.attribs.src).get();},

Is there anything you'd like reviewers to focus on?
Whether a callback style solution would be better ( a 5th parameter to preRender / postRender that contains callbacks plugins can use ), since in the long run one may find plugins requiring more and more functionality.

Testing instructions:
I added a <puml> tag, and an <include> tag ( including testPlantUML.md )
to the test site. Changing any of the source files ( e.g. activity.puml ) should
cause the affected pages to reload when serving the page.

Proposed commit message: (wrap lines at 72 characters)
Allow live reloading for plugin defined sources

This allows plugins to define a custom list of source files and file
types for the page to be watched, allowing live reload to rebuild
the affected page.

Comment threadsrc/Page.js Outdated
if (plugin.getSources) {
const sources = _.castArray(
plugin.getSources(content, this.pluginsContext[pluginName] || {},
this.frontMatter, this.getPluginConfig()));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why _.castArray? getSources should return an array.

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.

So that a single source file could be returned as well,
should I enforce returning an array instead?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Yes, since getSources is plural.

@ang-zeyu
ang-zeyuforce-pushed the watch-puml branch 2 times, most recently from 5dd6389 to 720648bCompareDecember 15, 2019 14:47
@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated getSources to require returning array instead as per method naming

@yamgent
yamgent self-requested a review December 16, 2019 03:50
@ang-zeyuang-zeyu changed the title [WIP] Allow live reloading for plugin defined sourcesAllow live reloading for plugin defined sourcesDec 16, 2019

@yamgentyamgent left a comment

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 good implementation-wise, comments are mostly about wordings:

Comment threaddocs/userGuide/usingPlugins.md Outdated
const $ = cheerio.load(content, { xmlMode: true });

return $('puml').map((i, tag) => tag.attribs.src).get();
},

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.

The indentation of the method body is off. Only the comment line was in the correct indentation

Comment threaddocs/userGuide/usingPlugins.md Outdated
During the `preRender` and `postRender` stages however, plugins may do custom processing using some other
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.

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.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin. implement the ``getSources`` method:

Prefer being more direct in documentations so that it is easier for the reader to process.

Comment threaddocs/userGuide/usingPlugins.md Outdated

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.
- `content`: The raw Markdown of any Markdown file (`.md`, `.mbd`, etc.).

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.

any -> the current? The use of "any" makes it seems like this call is not tied to any pages.

Comment threaddocs/userGuide/usingPlugins.md Outdated
source file types, as parsed from the raw Markdown, typically requiring rebuilding the site.

Hence, to add custom source files to watch, MarkBind allows defining an additional method in the plugin.
- `getSources(content, pluginContext, frontMatter, config)`: Called before the `preRender` function to retrieve an array of source file paths to watch.

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.

Returns an array of source file paths to watch. Called before a Markdown file'spreRender function is called.

Comment threadsrc/Page.js Outdated
};

/**
* Collect page sources provided by plugins

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 a bit wrong to say "page sources", since puml files are not really pages? Maybe "file sources"?

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Hi, thanks for looking through it! I've updated the relavant lines.

On another note, I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

@yamgent

Copy link
Copy Markdown
Member

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Updated, will squash if its fine!

@acjh

acjh commented Dec 18, 2019

Copy link
Copy Markdown
Contributor

I noticed that usingPlugins.md does not have documentation for the fourth parameter, config, even though it is used in the preRender and postRender functions. I've correspondingly also omitted it from getSources for now.

Was this an intentional decision to hide some of the implementation details? If not, I could update it as well.

It was probably an oversight. Feel free to add it in.

Actually, it was intentionally undocumented by @jamos-tay as of #714 (comment):

I needed access to Page.headingIndexingLevel, so I added a 4th parameter, page which is the Page object itself... Other plugins might need access to page config so this could be helpful

I'm thinking we can use this for internal plugins, but don't document it in user docs, since we don't want to expose authors to the implementation

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Actually, it was intentionally undocumented by @jamos-tay as of [#714 (comment)]

Thanks for the heads up!

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. Regarding the original concern for the change ( passing the entire Page being dangerous ), I could include a warning in the docs about includedFiles since it is used in Site.proto.updateSiteData(). Still, its a subsection to add into the docs which means more details for the user to read. Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

What's the take on this? 😮

@acjh

acjh commented Dec 19, 2019

Copy link
Copy Markdown
Contributor

Since @jamos-tay ended up going with the approach @marvinchin suggested, there isn't too much to document though. ... Other properties aside though, rootPath, sourcePath and resultPath seem to be quite useful for plugins.

The concern isn't that it is tedious to document. Rather, ideally, plugins should purely process content rather than use variables from and depend on the (filesystem-aware) implementation of Markbind CLI.

@ang-zeyu

Copy link
Copy Markdown
ContributorAuthor

Noted on the intended usage of plugins. Thanks!

Reverted the 'documentation updates' and squashed

@yamgent
yamgent merged commit 211cd6e into MarkBind:masterDec 23, 2019
@yamgentyamgent added this to the v2.7.1 milestone Dec 23, 2019
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 live-preview for .puml files

3 participants

@ang-zeyu@yamgent@acjh