Commit adf9bcf8 authored by Steffen van Bergerem's avatar Steffen van Bergerem

Update markdown-it

parent ea58c95f
......@@ -92,14 +92,13 @@ gem "js-routes", "1.0.0"
source "https://rails-assets.org" do
gem "rails-assets-jquery", "1.11.1" # Should be kept in sync with jquery-rails
gem "rails-assets-punycode", "1.3.2"
gem "rails-assets-markdown-it", "3.1.0"
gem "rails-assets-markdown-it-hashtag", "0.2.3"
gem "rails-assets-markdown-it-diaspora-mention", "0.2.1"
gem "rails-assets-markdown-it-sanitizer", "0.2.2"
gem "rails-assets-markdown-it", "4.0.3"
gem "rails-assets-markdown-it-hashtag", "0.3.0"
gem "rails-assets-markdown-it-diaspora-mention", "0.3.0"
gem "rails-assets-markdown-it-sanitizer", "0.3.0"
gem "rails-assets-markdown-it--markdown-it-for-inline", "0.1.0"
gem "rails-assets-markdown-it-sub", "0.1.0"
gem "rails-assets-markdown-it-sup", "0.1.0"
gem "rails-assets-markdown-it-sub", "1.0.0"
gem "rails-assets-markdown-it-sup", "1.0.0"
# jQuery plugins
......
......@@ -510,15 +510,14 @@ GEM
rails-assets-jquery.slimscroll (1.3.3)
rails-assets-jquery (>= 1.7)
rails-assets-markdown-it--markdown-it-for-inline (0.1.0)
rails-assets-markdown-it (3.1.0)
rails-assets-markdown-it-diaspora-mention (0.2.1)
rails-assets-markdown-it-hashtag (0.2.3)
rails-assets-markdown-it-sanitizer (0.2.2)
rails-assets-markdown-it-sub (0.1.0)
rails-assets-markdown-it-sup (0.1.0)
rails-assets-markdown-it (4.0.3)
rails-assets-markdown-it-diaspora-mention (0.3.0)
rails-assets-markdown-it-hashtag (0.3.0)
rails-assets-markdown-it-sanitizer (0.3.0)
rails-assets-markdown-it-sub (1.0.0)
rails-assets-markdown-it-sup (1.0.0)
rails-assets-perfect-scrollbar (0.5.9)
rails-assets-jquery (>= 1.10)
rails-assets-punycode (1.3.2)
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
rails-dom-testing (1.0.6)
......@@ -777,15 +776,14 @@ DEPENDENCIES
rails-assets-jquery-idletimer (= 1.0.1)!
rails-assets-jquery-placeholder (= 2.1.1)!
rails-assets-jquery-textchange (= 0.2.3)!
rails-assets-markdown-it (= 3.1.0)!
rails-assets-markdown-it (= 4.0.3)!
rails-assets-markdown-it--markdown-it-for-inline (= 0.1.0)!
rails-assets-markdown-it-diaspora-mention (= 0.2.1)!
rails-assets-markdown-it-hashtag (= 0.2.3)!
rails-assets-markdown-it-sanitizer (= 0.2.2)!
rails-assets-markdown-it-sub (= 0.1.0)!
rails-assets-markdown-it-sup (= 0.1.0)!
rails-assets-markdown-it-diaspora-mention (= 0.3.0)!
rails-assets-markdown-it-hashtag (= 0.3.0)!
rails-assets-markdown-it-sanitizer (= 0.3.0)!
rails-assets-markdown-it-sub (= 1.0.0)!
rails-assets-markdown-it-sup (= 1.0.0)!
rails-assets-perfect-scrollbar (= 0.5.9)!
rails-assets-punycode (= 1.3.2)!
rails-i18n (= 4.0.4)
rails-timeago (= 2.11.0)
rails_admin (= 0.6.7)
......
......@@ -4,28 +4,6 @@
app.helpers.textFormatter = function(text, mentions) {
mentions = mentions ? mentions : [];
var punycodeURL = function(url){
try {
while(url.indexOf("%") !== -1 && url !== decodeURI(url)) url = decodeURI(url);
}
catch(e){}
var addr = parse_url(url);
if( !addr.host ) addr.host = ""; // must not be 'undefined'
url = // rebuild the url
(!addr.scheme ? '' : addr.scheme +
( (addr.scheme.toLowerCase() === "mailto" || addr.scheme.toLowerCase() === "xmpp") ? ':' : '://')) +
(!addr.user ? '' : addr.user +
(!addr.pass ? '' : ':'+addr.pass) + '@') +
punycode.toASCII(addr.host) +
(!addr.port ? '' : ':' + addr.port) +
(!addr.path ? '' : encodeURI(addr.path) ) +
(!addr.query ? '' : '?' + encodeURI(addr.query) ) +
(!addr.fragment ? '' : '#' + encodeURI(addr.fragment) );
return url;
};
var md = window.markdownit({
breaks: true,
html: true,
......@@ -41,14 +19,13 @@
.replace(/<3/g, "");
});
md.use(inlinePlugin, 'link_new_window_and_punycode', 'link_open', function (tokens, idx) {
tokens[idx].href = tokens[idx].href.replace(/^www\./, "http://www.");
tokens[idx].href = punycodeURL(tokens[idx].href);
tokens[idx].target = "_blank";
});
md.use(inlinePlugin, 'image_punycode', 'image', function (tokens, idx) {
tokens[idx].src = punycodeURL(tokens[idx].src);
md.use(inlinePlugin, 'link_new_window_and_missing_http', 'link_open', function (tokens, idx) {
tokens[idx].attrs.forEach(function(attribute, index, array) {
if( attribute[0] === 'href' ) {
array[index][1] = attribute[1].replace(/^www\./, "http://www.");
}
});
tokens[idx].attrPush([ 'target', "_blank" ]);
});
var hashtagPlugin = window.markdownitHashtag;
......
......@@ -31,8 +31,6 @@
//= require markdown-it-sanitizer
//= require markdown-it-sub
//= require markdown-it-sup
//= require punycode
//= require parse_url
//= require clear-form
//= require app/app
//= require diaspora
......
......@@ -119,6 +119,7 @@ describe("app.helpers.textFormatter", function(){
it("adds a missing http://", function() {
expect(this.formatter('[test](www.google.com)')).toContain('href="http://www.google.com"');
expect(this.formatter('[test](http://www.google.com)')).toContain('href="http://www.google.com"');
expect(this.formatter('www.google.com')).toContain('href="http://www.google.com"');
});
it("respects code blocks", function() {
......@@ -185,6 +186,13 @@ describe("app.helpers.textFormatter", function(){
}, this);
});
it("correctly encodes image src to punycode", function() {
_.each(this.evilUrls, function(url, num) {
var text = this.formatter("![](" + url + ")");
expect(text).toContain(this.asciiUrls[num]);
}, this);
});
it("doesn't break link texts", function() {
var linkText = "check out this awesome link!";
var text = this.formatter( "["+linkText+"]("+this.evilUrls[0]+")" );
......@@ -251,12 +259,6 @@ describe("app.helpers.textFormatter", function(){
var parsed = this.formatter(this.input);
expect(parsed).toContain(this.correctHref);
});
it("gets correctly decoded, even when multiply encoded", function() {
var uglyUrl = encodeURI(encodeURI(encodeURI(this.input)));
var parsed = this.formatter(uglyUrl);
expect(parsed).toContain(this.correctHref);
});
});
it("doesn't fail for misc urls", function() {
......
// source: https://github.com/kvz/phpjs/blob/master/functions/url/parse_url.js
// commit 4966dea
// 28 Dec 2014
function parse_url(str, component) {
// discuss at: http://phpjs.org/functions/parse_url/
// original by: Steven Levithan (http://blog.stevenlevithan.com)
// reimplemented by: Brett Zamir (http://brett-zamir.me)
// input by: Lorenzo Pisani
// input by: Tony
// improved by: Brett Zamir (http://brett-zamir.me)
// note: original by http://stevenlevithan.com/demo/parseuri/js/assets/parseuri.js
// note: blog post at http://blog.stevenlevithan.com/archives/parseuri
// note: demo at http://stevenlevithan.com/demo/parseuri/js/assets/parseuri.js
// note: Does not replace invalid characters with '_' as in PHP, nor does it return false with
// note: a seriously malformed URL.
// note: Besides function name, is essentially the same as parseUri as well as our allowing
// note: an extra slash after the scheme/protocol (to allow file:/// as in PHP)
// example 1: parse_url('http://username:password@hostname/path?arg=value#anchor');
// returns 1: {scheme: 'http', host: 'hostname', user: 'username', pass: 'password', path: '/path', query: 'arg=value', fragment: 'anchor'}
// example 2: parse_url('http://en.wikipedia.org/wiki/%22@%22_%28album%29');
// returns 2: {scheme: 'http', host: 'en.wikipedia.org', path: '/wiki/%22@%22_%28album%29'}
// example 3: parse_url('https://host.domain.tld/a@b.c/folder')
// returns 3: {scheme: 'https', host: 'host.domain.tld', path: '/a@b.c/folder'}
// example 4: parse_url('https://gooduser:secretpassword@www.example.com/a@b.c/folder?foo=bar');
// returns 4: { scheme: 'https', host: 'www.example.com', path: '/a@b.c/folder', query: 'foo=bar', user: 'gooduser', pass: 'secretpassword' }
try {
this.php_js = this.php_js || {};
} catch (e) {
this.php_js = {};
}
var query;
var ini = (this.php_js && this.php_js.ini) || {};
var mode = (ini['phpjs.parse_url.mode'] && ini['phpjs.parse_url.mode'].local_value) || 'php';
var key = [
'source',
'scheme',
'authority',
'userInfo',
'user',
'pass',
'host',
'port',
'relative',
'path',
'directory',
'file',
'query',
'fragment'
];
var parser = {
php : /^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
loose : /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // Added one optional slash to post-scheme to catch file:/// (should restrict this)
};
var m = parser[mode].exec(str);
var uri = {};
var i = 14;
while (i--) {
if (m[i]) {
uri[key[i]] = m[i];
}
}
if (component) {
return uri[component.replace('PHP_URL_', '').toLowerCase()];
}
if (mode !== 'php') {
var name = (ini['phpjs.parse_url.queryKey'] &&
ini['phpjs.parse_url.queryKey'].local_value) || 'queryKey';
parser = /(?:^|&)([^&=]*)=?([^&]*)/g;
uri[name] = {};
query = uri[key[12]] || '';
query.replace(parser, function ($0, $1, $2) {
if ($1) {
uri[name][$1] = $2;
}
});
}
delete uri.source;
return uri;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment