diff --git a/bower.json b/bower.json
index 9219a95a94..1ace990cfe 100644
--- a/bower.json
+++ b/bower.json
@@ -37,7 +37,7 @@
"jquery-ui": "1.10.3",
"jquery.cookie": "1.4.0",
"js-emoji": "snicker/js-emoji#f25d8a303f",
- "marked": "0.2.9",
+ "remarkable": "^1.6.2",
"ngInfiniteScroll": "1.0.0",
"pnotify": "1.3.1",
"sticky": "*",
diff --git a/common/script/public/directives.js b/common/script/public/directives.js
index 5662014e39..93459812ea 100644
--- a/common/script/public/directives.js
+++ b/common/script/public/directives.js
@@ -6,18 +6,10 @@
*/
(function(){
var md = function () {
- marked.setOptions({
- gfm:true,
- pedantic:false,
- sanitize:true
- // callback for code highlighter
- // Uncomment this (and htljs.tabReplace below) if we add in highlight.js (http://www.heikura.me/#!/angularjs-markdown-directive)
-// highlight:function (code, lang) {
-// if (lang != undefined)
-// return hljs.highlight(lang, code).value;
-//
-// return hljs.highlightAuto(code).value;
-// }
+ var remarkable = new Remarkable({
+ // TODO: Add in code highlighting?
+ // highlight: function (#<{(|str, lang|)}>#) { return ''; }
+ linkify: true
});
emoji.img_path = 'common/img/emoji/unicode/';
@@ -26,57 +18,60 @@
if (markdown == undefined)
return '';
- markdown = marked(markdown);
+ markdown = remarkable.render(markdown);
markdown = emoji.replace_colons(markdown);
markdown = emoji.replace_unified(markdown);
return markdown;
};
+ // This was applie to marked, the old markdown library which has an xss exploit.
+ // If we want this behavior again, we'll need to rewrite it.
+ // ---
// [nickgordon20131123] this hacky override wraps images with a link to the image in a new window, and also adds some classes in case we want to style
- marked.InlineLexer.prototype.outputLink = function(cap, link) {
- var escape = function(html, encode) {
- return html
- .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"')
- .replace(/'/g, ''');
- };
- if (cap[0].charAt(0) !== '!') {
- return ''
- + this.output(cap[1])
- + '';
- } else {
- return '
';
- }
- }
+ // marked.InlineLexer.prototype.outputLink = function(cap, link) {
+ // var escape = function(html, encode) {
+ // return html
+ // .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&')
+ // .replace(//g, '>')
+ // .replace(/"/g, '"')
+ // .replace(/'/g, ''');
+ // };
+ // if (cap[0].charAt(0) !== '!') {
+ // return ''
+ // + this.output(cap[1])
+ // + '';
+ // } else {
+ // return '
';
+ // }
+ // }
//hljs.tabReplace = ' ';
diff --git a/karma.conf.js b/karma.conf.js
index 71da5a298f..5da4cd8dfe 100644
--- a/karma.conf.js
+++ b/karma.conf.js
@@ -31,7 +31,7 @@ module.exports = function karmaConfig (config) {
'website/public/bower_components/ngInfiniteScroll/build/ng-infinite-scroll.js',
'website/public/bower_components/select2/select2.js',
'website/public/bower_components/angular-ui-select2/src/select2.js',
- 'website/public/bower_components/marked/lib/marked.js',
+ 'website/public/bower_components/remarkable/dist/remarkable.min.js',
'website/public/bower_components/js-emoji/emoji.js',
'common/dist/scripts/habitrpg-shared.js',
diff --git a/package.json b/package.json
index b0ad4ce1b1..d78171c529 100644
--- a/package.json
+++ b/package.json
@@ -52,7 +52,6 @@
"js2xmlparser": "~1.0.0",
"lodash": "^3.10.1",
"loggly": "~1.0.8",
- "marked": "^0.3.5",
"merge-stream": "^1.0.0",
"method-override": "^2.3.5",
"moment": "~2.10.6",
@@ -72,6 +71,7 @@
"ps-tree": "^1.0.0",
"push-notify": "^1.1.1",
"q": "^1.4.1",
+ "remarkable": "^1.6.2",
"request": "~2.44.0",
"s3-upload-stream": "^1.0.6",
"serve-favicon": "^2.3.0",
diff --git a/website/public/manifest.json b/website/public/manifest.json
index c4d107c03e..cb1f29071e 100644
--- a/website/public/manifest.json
+++ b/website/public/manifest.json
@@ -8,7 +8,7 @@
"bower_components/bootstrap-tour/build/js/bootstrap-tour.js",
"bower_components/angular/angular.js",
"bower_components/angular-sanitize/angular-sanitize.js",
- "bower_components/marked/lib/marked.js",
+ "bower_components/remarkable/dist/remarkable.min.js",
"bower_components/angular-ui-router/release/angular-ui-router.js",
"bower_components/angular-resource/angular-resource.min.js",
"bower_components/angular-ui-utils/ui-utils.min.js",
diff --git a/website/src/routes/pages.js b/website/src/routes/pages.js
index 3c8ee639a4..e11e836e53 100644
--- a/website/src/routes/pages.js
+++ b/website/src/routes/pages.js
@@ -4,6 +4,10 @@ var router = express.Router();
var _ = require('lodash');
var locals = require('../middlewares/locals');
var i18n = require('../libs/i18n');
+var Remarkable = require('remarkable');
+var md = new Remarkable({
+ html: true,
+});
const TOTAL_USER_COUNT = '1,100,000';
@@ -26,7 +30,7 @@ _.each(pages, function(name){
router.get('/static/' + name, i18n.getUserLanguage, locals, function(req, res) {
res.render( 'static/' + name, {
env: res.locals.habitrpg,
- marked: require('marked'),
+ md: md,
userCount: TOTAL_USER_COUNT
});
});
@@ -40,7 +44,7 @@ _.each(shareables, function(name){
router.get('/social/' + name, i18n.getUserLanguage, locals, function(req, res) {
res.render( 'social/' + name, {
env: res.locals.habitrpg,
- marked: require('marked'),
+ md: md,
userCount: TOTAL_USER_COUNT
});
});
diff --git a/website/views/static/faq.jade b/website/views/static/faq.jade
index 9707de9902..c14efc2250 100644
--- a/website/views/static/faq.jade
+++ b/website/views/static/faq.jade
@@ -22,8 +22,8 @@ block content
- for heading, index in headings
a.h2.accordion.collapsed(ng-href='#' + heading, data-toggle='collapse')=env.t('faqQuestion' + index)
.clearfix.collapse(id=heading)
- !=marked(env.t('webFaqAnswer' + index))
+ !=md.render(env.t('webFaqAnswer' + index))
hr
- h3!=marked(env.t('webFaqStillNeedHelp'))
+ h3!=md.render(env.t('webFaqStillNeedHelp'))
diff --git a/website/views/static/overview.jade b/website/views/static/overview.jade
index c66fcce3b7..b22c377bf3 100644
--- a/website/views/static/overview.jade
+++ b/website/views/static/overview.jade
@@ -18,6 +18,6 @@ block content
- for step in stepsNum
h3=env.t('step'+step)
p
- !=marked(env.t('webStep'+step+'Text'))
+ !=md.render(env.t('webStep'+step+'Text'))
hr
- !=marked(env.t('overviewQuestions'))
+ !=md.render(env.t('overviewQuestions'))