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 ''
-          + escape(cap[1])
-          + ''; - } - } + // 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 ''
+    //       + escape(cap[1])
+    //       + ''; + // } + // } //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'))