mobile-cli-lib
Version:
common lib used by different CLI
150 lines (149 loc) • 8.62 kB
JavaScript
"use strict";
var Future = require("fibers/future");
var path = require("path");
var marked = require("marked");
var HtmlHelpService = (function () {
function HtmlHelpService($logger, $injector, $errors, $fs, $staticConfig, $microTemplateService, $opener, $commandsServiceProvider) {
this.$logger = $logger;
this.$injector = $injector;
this.$errors = $errors;
this.$fs = $fs;
this.$staticConfig = $staticConfig;
this.$microTemplateService = $microTemplateService;
this.$opener = $opener;
this.$commandsServiceProvider = $commandsServiceProvider;
this.pathToImages = this.$staticConfig.HTML_CLI_HELPERS_DIR;
this.pathToHtmlPages = this.$staticConfig.HTML_PAGES_DIR;
this.pathToManPages = this.$staticConfig.MAN_PAGES_DIR;
}
Object.defineProperty(HtmlHelpService.prototype, "pathToStylesCss", {
get: function () {
return path.join(this.$staticConfig.HTML_COMMON_HELPERS_DIR, "styles.css");
},
enumerable: true,
configurable: true
});
Object.defineProperty(HtmlHelpService.prototype, "pathToBasicPage", {
get: function () {
return path.join(this.$staticConfig.HTML_COMMON_HELPERS_DIR, "basic-page.html");
},
enumerable: true,
configurable: true
});
Object.defineProperty(HtmlHelpService.prototype, "pathToIndexHtml", {
get: function () {
return path.join(this.$staticConfig.HTML_PAGES_DIR, "index.html");
},
enumerable: true,
configurable: true
});
HtmlHelpService.prototype.generateHtmlPages = function () {
var _this = this;
return (function () {
var mdFiles = _this.$fs.enumerateFilesInDirectorySync(_this.pathToManPages);
var basicHtmlPage = _this.$fs.readFile(_this.pathToBasicPage).wait().toString();
var futures = _.map(mdFiles, function (markdownFile) { return _this.createHtmlPage(basicHtmlPage, markdownFile); });
Future.wait(futures);
_this.$logger.trace("Finished generating HTML files.");
}).future()();
};
HtmlHelpService.prototype.createHtmlPage = function (basicHtmlPage, pathToMdFile) {
var _this = this;
return (function () {
var mdFileName = path.basename(pathToMdFile);
var htmlFileName = mdFileName.replace(HtmlHelpService.MARKDOWN_FILE_EXTENSION, HtmlHelpService.HTML_FILE_EXTENSION);
_this.$logger.trace("Generating '%s' help topic.", htmlFileName);
var helpText = _this.$fs.readText(pathToMdFile).wait();
var outputText = _this.$microTemplateService.parseContent(helpText, { isHtml: true });
var htmlText = marked(outputText);
var filePath = pathToMdFile
.replace(path.basename(_this.pathToManPages), path.basename(_this.pathToHtmlPages))
.replace(mdFileName, htmlFileName);
_this.$logger.trace("HTML file path for '%s' man page is: '%s'.", mdFileName, filePath);
var outputHtml = basicHtmlPage
.replace(HtmlHelpService.MAN_PAGE_NAME_REGEX, mdFileName.replace(HtmlHelpService.MARKDOWN_FILE_EXTENSION, ""))
.replace(HtmlHelpService.HTML_COMMAND_HELP_REGEX, htmlText)
.replace(HtmlHelpService.RELATIVE_PATH_TO_STYLES_CSS_REGEX, path.relative(path.dirname(filePath), _this.pathToStylesCss))
.replace(HtmlHelpService.RELATIVE_PATH_TO_IMAGES_REGEX, path.relative(path.dirname(filePath), _this.pathToImages))
.replace(HtmlHelpService.RELATIVE_PATH_TO_INDEX_REGEX, path.relative(path.dirname(filePath), _this.pathToIndexHtml));
_this.$fs.writeFile(filePath, outputHtml).wait();
_this.$logger.trace("Finished writing file '%s'.", filePath);
}).future()();
};
HtmlHelpService.prototype.openHelpForCommandInBrowser = function (commandName) {
var _this = this;
return (function () {
var htmlPage = _this.convertCommandNameToFileName(commandName) + HtmlHelpService.HTML_FILE_EXTENSION;
_this.$logger.trace("Opening help for command '%s'. FileName is '%s'.", commandName, htmlPage);
_this.$fs.ensureDirectoryExists(_this.pathToHtmlPages).wait();
if (!_this.tryOpeningSelectedPage(htmlPage)) {
_this.$logger.trace("Required HTML file '%s' is missing. Let's try generating HTML files and see if we'll find it.", htmlPage);
_this.generateHtmlPages().wait();
if (!_this.tryOpeningSelectedPage(htmlPage)) {
_this.$errors.failWithoutHelp("Unable to find help for '%s'", commandName);
}
}
}).future()();
};
HtmlHelpService.prototype.convertCommandNameToFileName = function (commandName) {
var defaultCommandMatch = commandName.match(/(\w+?)\|\*/);
if (defaultCommandMatch) {
this.$logger.trace("Default command found. Replace current command name '%s' with '%s'.", commandName, defaultCommandMatch[1]);
commandName = defaultCommandMatch[1];
}
var availableCommands = this.$injector.getRegisteredCommandsNames(true).sort();
this.$logger.trace("List of registered commands: %s", availableCommands.join(", "));
if (commandName && _.startsWith(commandName, this.$commandsServiceProvider.dynamicCommandsPrefix) && !_.includes(availableCommands, commandName)) {
var dynamicCommands = this.$commandsServiceProvider.getDynamicCommands().wait();
if (!_.includes(dynamicCommands, commandName)) {
this.$errors.failWithoutHelp("Unknown command '%s'. Try '$ %s help' for a full list of supported commands.", commandName, this.$staticConfig.CLIENT_NAME.toLowerCase());
}
}
return commandName.replace(/\|/g, "-") || "index";
};
HtmlHelpService.prototype.tryOpeningSelectedPage = function (htmlPage) {
var fileList = this.$fs.enumerateFilesInDirectorySync(this.pathToHtmlPages);
this.$logger.trace("File list: " + fileList);
var pageToOpen = _.find(fileList, function (file) { return path.basename(file) === htmlPage; });
if (pageToOpen) {
this.$logger.trace("Found page to open: '%s'", pageToOpen);
this.$opener.open(pageToOpen);
return true;
}
this.$logger.trace("Unable to find file: '%s'", htmlPage);
return false;
};
HtmlHelpService.prototype.readMdFileForCommand = function (commandName) {
var _this = this;
return (function () {
var mdFileName = _this.convertCommandNameToFileName(commandName) + HtmlHelpService.MARKDOWN_FILE_EXTENSION;
_this.$logger.trace("Reading help for command '%s'. FileName is '%s'.", commandName, mdFileName);
var markdownFile = _.find(_this.$fs.enumerateFilesInDirectorySync(_this.pathToManPages), function (file) { return path.basename(file) === mdFileName; });
if (markdownFile) {
return _this.$fs.readText(markdownFile).wait();
}
_this.$errors.failWithoutHelp("Unknown command '%s'. Try '$ %s help' for a full list of supported commands.", mdFileName.replace(".md", ""), _this.$staticConfig.CLIENT_NAME.toLowerCase());
}).future()();
};
HtmlHelpService.prototype.getCommandLineHelpForCommand = function (commandName) {
var _this = this;
return (function () {
var helpText = _this.readMdFileForCommand(commandName).wait();
var outputText = _this.$microTemplateService.parseContent(helpText, { isHtml: false })
.replace(/ /g, " ")
.replace(HtmlHelpService.MARKDOWN_LINK_REGEX, "$1");
return outputText;
}).future()();
};
HtmlHelpService.MARKDOWN_FILE_EXTENSION = ".md";
HtmlHelpService.HTML_FILE_EXTENSION = ".html";
HtmlHelpService.MAN_PAGE_NAME_REGEX = /@/g;
HtmlHelpService.HTML_COMMAND_HELP_REGEX = /@/g;
HtmlHelpService.RELATIVE_PATH_TO_STYLES_CSS_REGEX = /@/g;
HtmlHelpService.RELATIVE_PATH_TO_IMAGES_REGEX = /@/g;
HtmlHelpService.RELATIVE_PATH_TO_INDEX_REGEX = /@/g;
HtmlHelpService.MARKDOWN_LINK_REGEX = /\[([\w \-\`\<\>\*\:\\]+?)\]\([\s\S]+?\)/g;
return HtmlHelpService;
}());
exports.HtmlHelpService = HtmlHelpService;
$injector.register("htmlHelpService", HtmlHelpService);