diff --git a/engine/converter.ts b/engine/converter.ts new file mode 100644 index 00000000..b7c2855e --- /dev/null +++ b/engine/converter.ts @@ -0,0 +1,83 @@ +import { ConsolePlatform } from "../runners/console/consoleInterfaces"; +import { ConsoleUtils } from "../runners/console/consoleUtils"; +import * as child_process from "child_process" +import * as path from "path" +import * as fs from "fs" +import { pathToFileURL } from "url"; +import { fstat } from "fs"; +import { FileContains } from "../assertions/fileContains"; + +export class Converter { + + private readonly TMP_DIR = "tmp_convert"; + + private commandsAvailable: boolean; + + constructor() { + + // Create temporary directory in which files can be created & modified + this.createTempDir(); + this.commandsAvailable = this.commandAvailable("asciidoctor -v") && this.commandAvailable("pandoc"); + } + + createTempDir(): void { + // Create tempDir if not already existing + let dir = this.getTempDir(); + if(!fs.existsSync(dir)) { + fs.mkdirSync(dir); + } + } + + + createTempFile(filename: string, content: string) { + fs.writeFileSync(path.join(this.getTempDir(),filename), content); + } + + readTempFile(filename: string): string { + let file_path = path.join(this.getTempDir(), filename); + let fileContent = fs.readFileSync(file_path, "utf8"); + return fileContent; + } + + getTempDir(): string { + // Return tempDir + return path.join(__dirname, this.TMP_DIR); + } + + convertAsciidocToMarkdown(asciidocString: string): string { + if(asciidocString !== undefined) { + /** + * 1. Write asciidocString to temp.adoc file + * 2. Use AsciiDoctor to convert AsciiDoc String to DocBook XML file + * 3. Use Pandoc to convert DocBook XML file to Markdown File + * 4. Read Markdown file (eventually combine with step 2?) + */ + + this.createTempFile("temp.adoc", asciidocString); + + let markdownString = ""; + if(this.commandsAvailable) { + this.executeCommand("asciidoctor -b docbook temp.adoc", this.getTempDir()); + this.executeCommand("pandoc -f docbook -t gfm temp.xml -o temp.md", this.getTempDir()); + markdownString = this.readTempFile("temp.md"); + }else { + markdownString = asciidocString; + } + return markdownString; + } + } + + commandAvailable(command: string): boolean { + let isAvailable = false; + let process = child_process.spawnSync(command, {shell: true, cwd: this.getTempDir()}); + return process.status == 0; + } + + executeCommand(command: string, directory: string) { + let process = child_process.spawnSync(command, {shell: true, cwd: directory}); + if(process.status != 0) { + console.log("Error executing command: " + command + " (exit code: )" + process.status + ")"); + console.log(process.stderr.toString(), process.toString()); + } + } +} \ No newline at end of file diff --git a/runners/katacoda/index.ts b/runners/katacoda/index.ts index c547a635..18db2d91 100644 --- a/runners/katacoda/index.ts +++ b/runners/katacoda/index.ts @@ -9,6 +9,7 @@ import { DirUtils } from "./dirUtils"; import * as path from 'path'; import * as ejs from 'ejs'; import * as fs from 'fs'; +import { Converter } from "../../engine/converter"; import { Assertions } from "../../assertions"; export class Katacoda extends Runner { @@ -25,6 +26,7 @@ export class Katacoda extends Runner { private terminalCounter: number = 1; private showVsCodeIde: boolean = false; private terminals: KatacodaTerminals[] = [{function: "default", terminalId: 1}]; + private converter: Converter; init(playbook: Playbook): void { // create directory for katacoda tutorials if not exist @@ -49,6 +51,8 @@ export class Katacoda extends Runner { //set working direktory this.setVariable(this.WORKSPACE_DIRECTORY, path.join("/root")); + this.converter = new Converter(); + this.assetManager = new KatacodaAssetManager(path.join(this.outputPathTutorial, "assets")); playbook.steps.forEach(step => { @@ -62,8 +66,8 @@ export class Katacoda extends Runner { async destroy(playbook: Playbook): Promise { let tutorialDirectoryName = path.basename(playbook.path); - this.renderTemplate("intro.md", path.join(this.outputPathTutorial, "intro.md"), { description: playbook.description, tutorialPath: tutorialDirectoryName }); - fs.writeFileSync(this.outputPathTutorial + 'finish.md', playbook.conclusion); + this.renderTemplate("intro.md", path.join(this.outputPathTutorial, "intro.md"), { description: this.converter.convertAsciidocToMarkdown(playbook.description), tutorialPath: tutorialDirectoryName }); + fs.writeFileSync(this.outputPathTutorial + 'finish.md', this.converter.convertAsciidocToMarkdown(playbook.conclusion)); // create and configure required files for the setup process this.renderTemplate(path.join("scripts", "intro_foreground.sh"), path.join(this.outputPathTutorial, "intro_foreground.sh"), { }); @@ -464,6 +468,13 @@ export class Katacoda extends Runner { } private renderTemplate(name: string, targetPath: string, variables) { + if("text" in variables) { + variables["text"] = this.converter.convertAsciidocToMarkdown(variables["text"]); + } + if("textAfter" in variables) { + variables["textAfter"] = this.converter.convertAsciidocToMarkdown(variables["textAfter"]); + } + let template = fs.readFileSync(path.join(this.getRunnerDirectory(),"templates", name), 'utf8'); let result = ejs.render(template, variables); fs.writeFileSync(targetPath, result, {flag: "a"});