Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Blog feed fixes #370 #407

Merged
merged 2 commits into from
Feb 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 3 additions & 69 deletions lib/core/Remarkable.js
Original file line number Diff line number Diff line change
@@ -1,47 +1,25 @@
'use strict';

const React = require('react');
const hljs = require('highlight.js');
const Markdown = require('remarkable');
const toSlug = require('./toSlug.js');
const renderMarkdown = require('./renderMarkdown.js');

const CWD = process.cwd();

/**
* The anchors plugin adds GFM-style anchors to headings.
*/
function anchors(md) {
md.renderer.rules.heading_open = function(tokens, idx /*, options, env */) {
const textToken = tokens[idx + 1];
return (
'<h' +
tokens[idx].hLevel +
'><a class="anchor" aria-hidden="true" name="' +
toSlug(textToken.content) +
'"></a><a href="#' +
toSlug(textToken.content) +
'" aria-hidden="true" class="hash-link" ><svg aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>'
);
};
}

class Remarkable extends React.Component {
content() {
if (this.props.source) {
return (
<span
dangerouslySetInnerHTML={{
__html: this.renderMarkdown(this.props.source),
__html: renderMarkdown(this.props.source),
}}
/>
);
} else {
return React.Children.map(this.props.children, child => {
if (typeof child === 'string') {
return (
<span
dangerouslySetInnerHTML={{__html: this.renderMarkdown(child)}}
/>
<span dangerouslySetInnerHTML={{__html: renderMarkdown(child)}} />
);
} else {
return child;
Expand All @@ -50,50 +28,6 @@ class Remarkable extends React.Component {
}
}

renderMarkdown(source) {
if (!this.md) {
const siteConfig = require(CWD + '/siteConfig.js');

this.md = new Markdown({
// Highlight.js expects hljs css classes on the code element.
// This results in <pre><code class="hljs css javascript">
langPrefix: 'hljs css ',
highlight: function(str, lang) {
lang =
lang || (siteConfig.highlight && siteConfig.highlight.defaultLang);
if (lang && hljs.getLanguage(lang)) {
try {
return hljs.highlight(lang, str).value;
} catch (err) {}
}

try {
return hljs.highlightAuto(str).value;
} catch (err) {}

return '';
},
html: true,
linkify: true,
});

// Register anchors plugin
this.md.use(anchors);

// Allow client sites to register their own plugins
if (siteConfig.markdownPlugins) {
siteConfig.markdownPlugins.forEach(function(plugin) {
this.md.use(plugin);
}, this);
}
}
const html = this.md.render(source);

// Ensure fenced code blocks use Highlight.js hljs class
// https://github.com/jonschlinkert/remarkable/issues/224
return html.replace(/<pre><code>/g, '<pre><code class="hljs">');
}

render() {
var Container = this.props.container;

Expand Down
85 changes: 85 additions & 0 deletions lib/core/renderMarkdown.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

const hljs = require('highlight.js');
const Markdown = require('remarkable');
const toSlug = require('./toSlug.js');

const CWD = process.cwd();

/**
* The anchors plugin adds GFM-style anchors to headings.
*/
function anchors(md) {
md.renderer.rules.heading_open = function(tokens, idx /*, options, env */) {
const textToken = tokens[idx + 1];
return (
'<h' +
tokens[idx].hLevel +
'><a class="anchor" aria-hidden="true" name="' +
toSlug(textToken.content) +
'"></a><a href="#' +
toSlug(textToken.content) +
'" aria-hidden="true" class="hash-link" ><svg aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>'
);
};
}

class MarkdownRenderer {
constructor() {
const siteConfig = require(CWD + '/siteConfig.js');

const md = new Markdown({
// Highlight.js expects hljs css classes on the code element.
// This results in <pre><code class="hljs css javascript">
langPrefix: 'hljs css ',
highlight: function(str, lang) {
lang =
lang || (siteConfig.highlight && siteConfig.highlight.defaultLang);
if (lang && hljs.getLanguage(lang)) {
try {
return hljs.highlight(lang, str).value;
} catch (err) {}
}

try {
return hljs.highlightAuto(str).value;
} catch (err) {}

return '';
},
html: true,
linkify: true,
});

// Register anchors plugin
md.use(anchors);

// Allow client sites to register their own plugins
if (siteConfig.markdownPlugins) {
siteConfig.markdownPlugins.forEach(function(plugin) {
md.use(plugin);
});
}

this._md = md;
}

toHtml(source) {
const html = this._md.render(source);

// Ensure fenced code blocks use Highlight.js hljs class
// https://github.com/jonschlinkert/remarkable/issues/224
return html.replace(/<pre><code>/g, '<pre><code class="hljs">');
}
}

const renderMarkdown = new MarkdownRenderer();

module.exports = source => {
return renderMarkdown.toHtml(source);
};
4 changes: 4 additions & 0 deletions lib/server/feed.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ const blogFolder = path.resolve('../blog/');
const blogRootURL = siteConfig.url + '/blog';
const jestImage = siteConfig.url + '/' + siteConfig.headerIcon;

const renderMarkdown = require('../core/renderMarkdown.js');

/****************************************************************************/

let readMetadata;
Expand Down Expand Up @@ -63,6 +65,8 @@ module.exports = function(type) {
}
}

content = renderMarkdown(content);

feed.addItem({
title: post.title,
link: url,
Expand Down