Skip to content

Commit

Permalink
Allow an array for specifying page src or glob (#1118)
Browse files Browse the repository at this point in the history
The site configuration does not allow using an array for specifying
pages in the src or glob property.
The method for collecting the addressable pages can also be
made slightly simpler in the process.

Let’s do so, reducing the amount of repeated configuration the
author potentially needs to write.
Let’s also simplify the method for collecting addressable pages
in the process.
  • Loading branch information
ang-zeyu authored and Marvin Chin committed Apr 10, 2020
1 parent 2b22118 commit bf1239d
Show file tree
Hide file tree
Showing 11 changed files with 79 additions and 123 deletions.
8 changes: 1 addition & 7 deletions docs/dg-site.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,11 @@
"titlePrefix": "MarkBind",
"pages": [
{
"glob": "**/*.mbd"
},
{
"glob": "*.md"
"glob": ["**/*.mbd", "*.md", "devGuide/*.md"]
},
{
"src": "index.md",
"searchable": "no"
},
{
"glob": "devGuide/*.md"
}
],
"headingIndexingLevel": 6,
Expand Down
30 changes: 7 additions & 23 deletions docs/site.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,16 @@
"titlePrefix": "MarkBind",
"pages": [
{
"glob": "**/*.mbd"
"glob": ["**/*.mbd", "*.md", "userGuide/*.md", "devGuide/*.md"]
},
{
"glob": "*.md"
},
{
"src": "index.md",
"searchable": "no"
},
{
"glob": "userGuide/*.md"
},
{
"src": "userGuide/fullSyntaxReference.md",
"src": [
"index.md",
"userGuide/fullSyntaxReference.md",
"userGuide/syntaxCheatSheet.md",
"userGuide/readerFacingFeatures.md"
],
"searchable": "no"
},
{
"src": "userGuide/syntaxCheatSheet.md",
"searchable": "no"
},
{
"src": "userGuide/readerFacingFeatures.md",
"searchable": "no"
},
{
"glob": "devGuide/*.md"
}
],
"plugins" : [
Expand Down
27 changes: 7 additions & 20 deletions docs/ug-site.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,15 @@
"titlePrefix": "MarkBind",
"pages": [
{
"glob": "**/*.mbd"
"glob": ["**/*.mbd", "*.md", "userGuide/*.md"]
},
{
"glob": "*.md"
},
{
"src": "index.md",
"searchable": "no"
},
{
"glob": "userGuide/*.md"
},
{
"src": "userGuide/fullSyntaxReference.md",
"searchable": "no"
},
{
"src": "userGuide/syntaxCheatSheet.md",
"searchable": "no"
},
{
"src": "userGuide/readerFacingFeatures.md",
"src": [
"index.md",
"userGuide/fullSyntaxReference.md",
"userGuide/syntaxCheatSheet.md",
"userGuide/readerFacingFeatures.md"
],
"searchable": "no"
}
],
Expand Down
7 changes: 5 additions & 2 deletions docs/userGuide/siteConfiguration.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,11 @@ _(Optional)_ **The theme for the generated site.** Uses the default Bootstrap th

**An array of pages to be rendered.**

* **`src`**/**`glob`**: `src` can be used to specify a file e.g., `docs/index.md`.<br>
Alternatively, `glob` can be used to define a file pattern in the [_glob syntax_](https://en.wikipedia.org/wiki/Glob_(programming)) e.g., `**/*.md`.
* **`src/glob`**
* `src` can be used to specify a single file, or an array of files.<br>
{{ icon_examples }} `docs/index.md` or `[ 'docs/index.md', 'docs/userGuide.md' ]` { .my-1 }
* `glob` can be used alternatively to define a file pattern in the [_glob syntax_](https://en.wikipedia.org/wiki/Glob_(programming)), or an array of such file patterns.<br>
{{ icon_examples }} `**/*.md` or `[ '**/*.md', '**/*.mbdf' ]` { .my-2 }
* **`title`**: The page `<title>` for the generated web page. Titles specified here take priority over titles specified in the [front matter](addingPages.html#front-matter) of individual pages.
* **`layout`**: The [layout](tweakingThePageStructure.html#page-layouts) to be used by the page. Default: `default`.
* **`searchable`**: Specifies that the page(s) should be excluded from searching. Default: `yes`.
Expand Down
45 changes: 24 additions & 21 deletions src/Site.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const injectMarkdownItSpecialTags = require(

const _ = {};
_.difference = require('lodash/difference');
_.flatMap = require('lodash/flatMap');
_.get = require('lodash/get');
_.has = require('lodash/has');
_.includes = require('lodash/includes');
Expand Down Expand Up @@ -442,36 +443,38 @@ class Site {
*/
collectAddressablePages() {
const { pages } = this.siteConfig;
const addressableGlobs = pages.filter(page => page.glob);
this.addressablePages = pages.filter(page => page.src);
const pagesFromSrc = _.flatMap(pages.filter(page => page.src), page => (Array.isArray(page.src)
? page.src.map(pageSrc => ({ ...page, src: pageSrc }))
: [page]));
const set = new Set();
const duplicatePages = this.addressablePages
const duplicatePages = pagesFromSrc
.filter(page => set.size === set.add(page.src).size)
.map(page => page.src);
if (duplicatePages.length > 0) {
return Promise.reject(
new Error(`Duplicate page entries found in site config: ${_.uniq(duplicatePages).join(', ')}`));
}
const globPaths = addressableGlobs.reduce((globPages, addressableGlob) =>
globPages.concat(walkSync(this.rootPath, {
directories: false,
globs: [addressableGlob.glob],
ignore: [CONFIG_FOLDER_NAME, SITE_FOLDER_NAME],
}).map(globPath => ({
src: globPath,
searchable: addressableGlob.searchable,
layout: addressableGlob.layout,
frontmatter: addressableGlob.frontmatter,
}))), []);
// Add pages collected by walkSync and merge properties for pages
const pagesFromGlobs = _.flatMap(pages.filter(page => page.glob), page => walkSync(this.rootPath, {
directories: false,
globs: Array.isArray(page.glob) ? page.glob : [page.glob],
ignore: [CONFIG_FOLDER_NAME, SITE_FOLDER_NAME],
}).map(filePath => ({
src: filePath,
searchable: page.searchable,
layout: page.layout,
frontmatter: page.frontmatter,
})));
/*
Add pages collected from globs and merge properties for pages
Page properties collected from src have priority over page properties from globs,
while page properties from later entries take priority over earlier ones.
*/
const filteredPages = {};
globPaths.concat(this.addressablePages).forEach((page) => {
pagesFromGlobs.concat(pagesFromSrc).forEach((page) => {
const filteredPage = _.omitBy(page, _.isUndefined);
if (page.src in filteredPages) {
filteredPages[page.src] = { ...filteredPages[page.src], ...filteredPage };
} else {
filteredPages[page.src] = filteredPage;
}
filteredPages[page.src] = page.src in filteredPages
? { ...filteredPages[page.src], ...filteredPage }
: filteredPage;
});
this.addressablePages = Object.values(filteredPages);

Expand Down
5 changes: 1 addition & 4 deletions src/template/default/site.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,7 @@
"title": "Landing Page"
},
{
"glob": "**/index.md"
},
{
"glob": "**/*.+(md|mbd)"
"glob": ["**/index.md", "**/*.+(md|mbd)"]
}
],
"deploy": {
Expand Down
8 changes: 2 additions & 6 deletions src/template/minimal/site.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,10 @@
"title": "Hello World"
},
{
"glob": "**/index.md"
},
{
"glob": "**/*.+(md|mbd)"
"glob": ["**/index.md", "**/*.+(md|mbd)"]
}
],
"deploy": {
"message": "Site Update."
}
}

}
12 changes: 6 additions & 6 deletions test/functional/test_site/expected/siteData.json
Original file line number Diff line number Diff line change
Expand Up @@ -152,19 +152,19 @@
"headingKeywords": {}
},
{
"src": "testExternalScripts.md",
"title": "Hello World",
"layout": "default",
"head": "overwriteLayoutHead.md",
"layout": "testLayout",
"src": "testLayoutsOverride.md",
"globalOverrideProperty": "Overridden by global override",
"globalAndFrontMatterOverrideProperty": "Overridden by global override",
"headings": {},
"headingKeywords": {}
},
{
"src": "testExternalScripts.md",
"title": "Hello World",
"head": "overwriteLayoutHead.md",
"layout": "testLayout",
"src": "testLayouts.md",
"layout": "default",
"globalOverrideProperty": "Overridden by global override",
"globalAndFrontMatterOverrideProperty": "Overridden by global override",
"headings": {},
Expand All @@ -174,7 +174,7 @@
"title": "Hello World",
"head": "overwriteLayoutHead.md",
"layout": "testLayout",
"src": "testLayoutsOverride.md",
"src": "testLayouts.md",
"globalOverrideProperty": "Overridden by global override",
"globalAndFrontMatterOverrideProperty": "Overridden by global override",
"headings": {},
Expand Down
12 changes: 2 additions & 10 deletions test/functional/test_site/site.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"layout": "testAfterSetup"
},
{
"src": "testEmptyFrontmatter.md",
"src": ["testEmptyFrontmatter.md", "testLayoutsOverride.md"],
"title": "Hello World",
"layout": "testLayout"
},
Expand All @@ -34,15 +34,7 @@
"title": "Hello World"
},
{
"src": "testLayoutsOverride.md",
"title": "Hello World",
"layout": "testLayout"
},
{
"glob": "**/index.md"
},
{
"glob": "**/test_md_fragment.md"
"glob": ["**/index.md", "**/test_md_fragment.md"]
},
{
"src": "testAntiFOUCStyles.md",
Expand Down
14 changes: 7 additions & 7 deletions test/functional/test_site_convert/expected/siteData.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
{
"enableSearch": true,
"pages": [
{
"src": "index.md",
"title": "Landing Page",
"layout": "default",
"headings": {},
"headingKeywords": {}
},
{
"src": "Home.md",
"title": "",
Expand Down Expand Up @@ -84,6 +77,13 @@
"layout": "default",
"headings": {},
"headingKeywords": {}
},
{
"src": "index.md",
"title": "Landing Page",
"layout": "default",
"headings": {},
"headingKeywords": {}
}
]
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,6 @@
{
"enableSearch": true,
"pages": [
{
"header": "header.md",
"pageNav": 2,
"pageNavTitle": "Chapters of This Page",
"siteNav": "site-nav.md",
"src": "index.md",
"title": "Landing Page",
"layout": "default",
"headings": {
"heading-1": "Heading 1",
"sub-heading-1-1": "Sub Heading 1.1",
"sub-heading-1-2": "Sub Heading 1.2",
"heading-2": "Heading 2",
"heading-3": "Heading 3"
},
"headingKeywords": {}
},
{
"header": "header.md",
"siteNav": "site-nav.md",
Expand Down Expand Up @@ -55,6 +38,23 @@
"layout": "default",
"headings": {},
"headingKeywords": {}
},
{
"header": "header.md",
"pageNav": 2,
"pageNavTitle": "Chapters of This Page",
"siteNav": "site-nav.md",
"src": "index.md",
"title": "Landing Page",
"layout": "default",
"headings": {
"heading-1": "Heading 1",
"sub-heading-1-1": "Sub Heading 1.1",
"sub-heading-1-2": "Sub Heading 1.2",
"heading-2": "Heading 2",
"heading-3": "Heading 3"
},
"headingKeywords": {}
}
]
}

0 comments on commit bf1239d

Please sign in to comment.