From 15e22ca3f1500d497780fbcf510f27d54772c0d2 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 15 May 2018 16:27:34 +0100 Subject: [PATCH] Koenig - Code card server-side rendering refs https://github.com/TryGhost/Ghost/issues/9623 - add support for `code` card that renders into `
...
` - render language class if one is provided --- packages/kg-default-cards/lib/cards/code.js | 24 ++++++++++ packages/kg-default-cards/lib/cards/index.js | 15 +++--- .../kg-default-cards/test/cards/code_spec.js | 48 +++++++++++++++++++ 3 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 packages/kg-default-cards/lib/cards/code.js create mode 100644 packages/kg-default-cards/test/cards/code_spec.js diff --git a/packages/kg-default-cards/lib/cards/code.js b/packages/kg-default-cards/lib/cards/code.js new file mode 100644 index 000000000..15096567c --- /dev/null +++ b/packages/kg-default-cards/lib/cards/code.js @@ -0,0 +1,24 @@ +module.exports = { + name: 'code', + type: 'dom', + render(opts) { + let payload = opts.payload; + let dom = opts.env.dom; + + if (!payload.code) { + return ''; + } + + let pre = dom.createElement('pre'); + let code = dom.createElement('code'); + + if (payload.language) { + code.setAttribute('class', `language-${payload.language}`); + } + + code.appendChild(dom.createTextNode(payload.code)); + pre.appendChild(code); + + return pre; + } +}; diff --git a/packages/kg-default-cards/lib/cards/index.js b/packages/kg-default-cards/lib/cards/index.js index 1cbca3a3b..a9f79356b 100644 --- a/packages/kg-default-cards/lib/cards/index.js +++ b/packages/kg-default-cards/lib/cards/index.js @@ -1,9 +1,10 @@ 'use strict'; -const hr = require('./hr'); -const html = require('./html'); -const image = require('./image'); -const markdown = require('./markdown'); -const cardMarkdown = require('./card-markdown'); - -module.exports = [hr, html, image, markdown, cardMarkdown]; +module.exports = [ + require('./card-markdown'), + require('./code'), + require('./hr'), + require('./html'), + require('./image'), + require('./markdown') +]; diff --git a/packages/kg-default-cards/test/cards/code_spec.js b/packages/kg-default-cards/test/cards/code_spec.js new file mode 100644 index 000000000..2cb6b1add --- /dev/null +++ b/packages/kg-default-cards/test/cards/code_spec.js @@ -0,0 +1,48 @@ +'use strict'; + +const should = require('should'); // jshint ignore:line +const card = require('../../../../../server/lib/mobiledoc/cards/code'); +const SimpleDom = require('simple-dom'); +const serializer = new SimpleDom.HTMLSerializer(SimpleDom.voidMap); + +describe('Code card', function () { + it('Renders and escapes', function () { + let opts = { + env: { + dom: new SimpleDom.Document() + }, + payload: { + code: '

Test

' + } + }; + + serializer.serialize(card.render(opts)).should.match('
<p>Test</p>
'); + }); + + it('Renders language class if provided', function () { + let opts = { + env: { + dom: new SimpleDom.Document() + }, + payload: { + code: '

Test

', + language: 'html' + } + }; + + serializer.serialize(card.render(opts)).should.match('
<p>Test</p>
'); + }); + + it('Renders nothing when payload is undefined', function () { + let opts = { + env: { + dom: new SimpleDom.Document() + }, + payload: { + code: undefined + } + }; + + serializer.serialize(card.render(opts)).should.match(''); + }); +});