Skip to content

Commit

Permalink
Add initial prototype of wiki conversion
Browse files Browse the repository at this point in the history
  • Loading branch information
amad-person committed Feb 17, 2019
1 parent f1bd77e commit 31fa32c
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 1 deletion.
14 changes: 13 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,27 @@ program

program
.command('init [root]')
.option('-w, --wiki', 'convert Github wiki to a MarkBind website')
.alias('i')
.description('init a markbind website project')
.action((root) => {
.action((root, options) => {
const rootFolder = path.resolve(root || process.cwd());
const outputRoot = path.join(rootFolder, '_site');
printHeader();
Site.initSite(rootFolder)
.then(() => {
logger.info('Initialization success.');
})
.then(() => {
if (options.wiki) {
logger.info('Converting wiki.');
new Site(rootFolder, outputRoot).convert(rootFolder)
.then(() => {
logger.info('Conversion success.');
})
.catch(handleError);
}
})
.catch(handleError);
});

Expand Down
124 changes: 124 additions & 0 deletions src/Site.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ const TEMP_FOLDER_NAME = '.temp';
const TEMPLATE_ROOT_FOLDER_NAME = 'template';
const TEMPLATE_SITE_ASSET_FOLDER_NAME = 'markbind';

const ABOUT_MARKDOWN_FILE = 'about.md';
const BUILT_IN_PLUGIN_FOLDER_NAME = 'plugins';
const FAVICON_DEFAULT_PATH = 'favicon.ico';
const FONT_AWESOME_PATH = 'asset/font-awesome.csv';
Expand All @@ -46,12 +47,15 @@ const PROJECT_PLUGIN_FOLDER_NAME = '_markbind/plugins';
const SITE_CONFIG_NAME = 'site.json';
const SITE_DATA_NAME = 'siteData.json';
const SITE_NAV_PATH = '_markbind/navigation/site-nav.md';
const TOP_NAV_PATH = '_markbind/common/topNav.md';
const LAYOUT_DEFAULT_NAME = 'default';
const LAYOUT_FILES = ['navigation.md', 'head.md', 'footer.md', 'styles.css'];
const LAYOUT_FOLDER_PATH = '_markbind/layouts';
const LAYOUT_SCRIPTS_PATH = 'scripts.js';
const LAYOUT_SITE_FOLDER_NAME = 'layouts';
const USER_VARIABLES_PATH = '_markbind/variables.md';
const WIKI_SITE_NAV_PATH = '_Sidebar.md';
const WIKI_FOOTER_PATH = '_Footer.md';

const SITE_CONFIG_DEFAULT = {
baseUrl: '',
Expand Down Expand Up @@ -82,6 +86,9 @@ const SITE_CONFIG_DEFAULT = {
},
};

const ABOUT_MARKDOWN_DEFAULT = '# About\n'
+ 'Welcome to your **About Us** page.\n';

const FOOTER_DEFAULT = '<footer>\n'
+ ' <div class="text-center">\n'
+ ' This is a dynamic height footer that supports variables {{glyphicon_tags}} '
Expand All @@ -105,6 +112,24 @@ const SITE_NAV_DEFAULT = '<navigation>\n'
+ '* [Home {{glyphicon_home}}]({{baseUrl}}/index.html)\n'
+ '</navigation>\n';

const TOP_NAV_DEFAULT = '<navbar placement="top" type="inverse">\n'
+ ' <a slot="brand" href="{{baseUrl}}/index.html" title="Home" class="navbar-brand">'
+ '<i class="far fa-file-image"></i></a>\n'
+ ' <li><a href="{{baseUrl}}/index.html" class="nav-link">HOME</a></li>\n'
+ ' <li><a href="{{baseUrl}}/about.html" class="nav-link">ABOUT</a></li>\n'
+ ' <li>\n'
+ ' <a href="https://github.com/MarkBind/markbind" target="_blank" class="nav-link">\n'
+ ' <i class="fab fa-github"></i>\n'
+ ' </a>\n'
+ ' </li>\n'
+ ' <li slot="right">\n'
+ ' <form class="navbar-form">\n'
+ ' <searchbar :data="searchData" placeholder="Search" :on-hit="searchCallback"'
+ ' menu-align-right></searchbar>\n'
+ ' </form>\n'
+ ' </li>\n'
+ '</navbar>';

const LAYOUT_SCRIPTS_DEFAULT = 'MarkBind.afterSetup(() => {\n'
+ ' // Include code to be called after MarkBind setup here.\n'
+ '});\n';
Expand Down Expand Up @@ -386,6 +411,105 @@ Site.prototype.createPage = function (config) {
});
};

/**
* Converts an existing Github wiki to a MarkBind website.
*/
Site.prototype.convert = function (rootPath) {
const aboutPath = path.join(rootPath, ABOUT_MARKDOWN_FILE);
const configPath = path.join(rootPath, SITE_CONFIG_NAME);
const footerPath = path.join(rootPath, FOOTER_PATH);
const siteLayoutPath = path.join(rootPath, LAYOUT_FOLDER_PATH);
const siteLayoutSiteNavDefaultPath = path.join(siteLayoutPath, LAYOUT_DEFAULT_NAME, 'navigation.md');
const siteLayoutFooterDefaultPath = path.join(siteLayoutPath, LAYOUT_DEFAULT_NAME, 'footer.md');
const topNavDefaultPath = path.join(rootPath, TOP_NAV_PATH);
const wikiSiteNavPath = path.join(rootPath, WIKI_SITE_NAV_PATH);
const wikiFooterPath = path.join(rootPath, WIKI_FOOTER_PATH);

return new Promise((resolve, reject) => {
fs.accessAsync(aboutPath)
.catch(() => {
if (fs.existsSync(aboutPath)) {
return Promise.resolve();
}
return fs.outputFileAsync(aboutPath, ABOUT_MARKDOWN_DEFAULT);
})
.then(() => fs.accessAsync(wikiFooterPath))
.then(() => {
const footerContent = fs.readFileSync(wikiFooterPath, 'utf8');
const wrappedFooterContent = `<footer>\n\t${footerContent}\n</footer>`;
return fs.outputFileSync(siteLayoutFooterDefaultPath, wrappedFooterContent);
})
.catch(() => {
if (fs.existsAsync(footerPath)) {
return fs.copyAsync(footerPath, siteLayoutFooterDefaultPath);
}
return Promise.resolve();
})
.then(() => fs.accessAsync(wikiSiteNavPath))
.then(() => {
const siteNavContent = fs.readFileSync(wikiSiteNavPath, 'utf8');
const wrappedSiteNavContent = `<navigation>\n${siteNavContent}\n</navigation>`;
return fs.outputFileSync(siteLayoutSiteNavDefaultPath, wrappedSiteNavContent);
})
.catch(() => {
const siteNavData = this.getSiteNavData();
return fs.outputFileAsync(siteLayoutSiteNavDefaultPath, siteNavData);
})
.then(() => fs.readJsonAsync(configPath))
.then((config) => {
const layoutObj = { glob: '**/*.+(md|mbd)', layout: LAYOUT_DEFAULT_NAME };
config.pages.push(layoutObj);
return fs.outputJsonAsync(configPath, config);
})
.then(() => fs.accessAsync(topNavDefaultPath))
.catch(() => {
if (fs.existsSync(topNavDefaultPath)) {
return Promise.resolve();
}
return fs.outputFileAsync(topNavDefaultPath, TOP_NAV_DEFAULT);
})
.then(() => this.addTopNavToAddressablePages(rootPath, topNavDefaultPath))
.then(resolve)
.catch(reject);
});
};

Site.prototype.addTopNavToAddressablePages = function (rootPath, topNavDefaultPath) {
return new Promise((resolve, reject) => {
this.readSiteConfig()
.then(() => this.collectAddressablePages())
.then(() => {
this.addressablePages
.filter(addressablePage => !addressablePage.src.startsWith('_'))
.forEach((addressablePage) => {
const addressablePagePath = path.join(rootPath, addressablePage.src);
const topNavRelativePath = path.relative(rootPath, topNavDefaultPath);
if (topNavRelativePath.length > 0) {
const includeTopNavCode = `<include src="${topNavRelativePath}" />\n\n`;
const addressablePageContent = fs.readFileSync(addressablePagePath, 'utf8');
const updatedAddressablePageContent = includeTopNavCode + addressablePageContent;
return fs.outputFileAsync(addressablePagePath, updatedAddressablePageContent);
}
return Promise.resolve();
});
})
.then(resolve)
.catch(reject);
});
};

Site.prototype.getSiteNavData = function () {
return new Promise((resolve, reject) => {
this.readSiteConfig()
.then(() => this.collectAddressablePages())
.then(() => {
console.log(this.addressablePages);
})
.then(resolve)
.catch(reject);
});
};

/**
* Updates the paths to be traversed as addressable pages and returns a list of filepaths to be deleted
*/
Expand Down

0 comments on commit 31fa32c

Please sign in to comment.