From 04643f878892bedee1d370bbb8162c32bd3dd642 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 21 Jan 2016 17:12:28 +0100 Subject: [PATCH] first steps in supporting markdown preview --- src/vs/base/browser/htmlContentRenderer.ts | 19 +++++++++++++++++-- src/vs/base/common/htmlContent.ts | 6 +++++- .../api/node/extHostTypeConverters.ts | 6 +++--- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/vs/base/browser/htmlContentRenderer.ts b/src/vs/base/browser/htmlContentRenderer.ts index a7de1cefb84..9062a1fd850 100644 --- a/src/vs/base/browser/htmlContentRenderer.ts +++ b/src/vs/base/browser/htmlContentRenderer.ts @@ -7,6 +7,7 @@ import DOM = require('vs/base/browser/dom'); import {IHTMLContentElement} from 'vs/base/common/htmlContent'; +import {marked} from 'vs/base/common/marked/marked'; export type RenderableContent = string | IHTMLContentElement | IHTMLContentElement[]; @@ -18,13 +19,13 @@ export interface RenderOptions { /** * Create html nodes for the given content element. - * formattedText property supports **bold**, __italics__, and [[actions]] + * * @param content a html element description * @param actionCallback a callback function for any action links in the string. Argument is the zero-based index of the clicked action. */ export function renderHtml(content: RenderableContent, options: RenderOptions = {}): Node { if (typeof content === 'string') { - return _renderHtml({ text: content }, options); + return _renderHtml({ isText: true, text: content }, options); } else if (Array.isArray(content)) { return _renderHtml({ children: content }, options); } else if (content) { @@ -32,6 +33,11 @@ export function renderHtml(content: RenderableContent, options: RenderOptions = } } +const renderer = new marked.Renderer(); +renderer.link = function(href, title, text): string { + return `${text}` +} + function _renderHtml(content: IHTMLContentElement, options: RenderOptions = {}): Node { let {codeBlockRenderer, actionCallback} = options; @@ -69,6 +75,15 @@ function _renderHtml(content: IHTMLContentElement, options: RenderOptions = {}): if (content.formattedText) { renderFormattedText(element, parseFormattedText(content.formattedText), actionCallback); } + if (content.markdown) { + const options = { sanitize: true, tables: false, silent: true, renderer }; + element.innerHTML = marked(content.markdown, options); + DOM.addStandardDisposableListener(element, 'click', (event) => { + if (event.target.tagName === 'A') { + console.log(event.target, event.target.dataset['href']); + } + }); + } return element; } diff --git a/src/vs/base/common/htmlContent.ts b/src/vs/base/common/htmlContent.ts index 454412240b7..826ca0e709b 100644 --- a/src/vs/base/common/htmlContent.ts +++ b/src/vs/base/common/htmlContent.ts @@ -6,6 +6,9 @@ 'use strict'; export interface IHTMLContentElement { + /** + * supports **bold**, __italics__, and [[actions]] + */ formattedText?:string; text?: string; className?: string; @@ -13,7 +16,8 @@ export interface IHTMLContentElement { customStyle?: any; tagName?: string; children?: IHTMLContentElement[]; - code?: { language: string; value: string; }; isText?: boolean; role?: string; + markdown?: string; + code?: { language: string; value: string; }; } \ No newline at end of file diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index 0e38c558af8..ceb6080c1ba 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -126,7 +126,7 @@ export function toViewColumn(position?: EditorPosition): vscode.ViewColumn { export function fromFormattedString(value: vscode.MarkedString): IHTMLContentElement { if (typeof value === 'string') { - return { formattedText: value }; + return { markdown: value }; } else if (typeof value === 'object') { return { code: value }; } @@ -136,8 +136,8 @@ export function toFormattedString(value: IHTMLContentElement): vscode.MarkedStri if (typeof value.code === 'string') { return value.code; } - let {formattedText, text} = value; - return formattedText || text || ''; + let {markdown, text} = value; + return markdown || text || ''; } function isMarkedStringArr(something: vscode.MarkedString | vscode.MarkedString[]): something is vscode.MarkedString[] {