Merge pull request #5814 from svbergerem/update-markdown-it
Update markdown-it
This commit is contained in:
commit
b047013dd0
6 changed files with 33 additions and 147 deletions
13
Gemfile
13
Gemfile
|
|
@ -92,14 +92,13 @@ gem "js-routes", "1.0.0"
|
||||||
source "https://rails-assets.org" do
|
source "https://rails-assets.org" do
|
||||||
gem "rails-assets-jquery", "1.11.1" # Should be kept in sync with jquery-rails
|
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", "4.0.3"
|
||||||
gem "rails-assets-markdown-it", "3.1.0"
|
gem "rails-assets-markdown-it-hashtag", "0.3.0"
|
||||||
gem "rails-assets-markdown-it-hashtag", "0.2.3"
|
gem "rails-assets-markdown-it-diaspora-mention", "0.3.0"
|
||||||
gem "rails-assets-markdown-it-diaspora-mention", "0.2.1"
|
gem "rails-assets-markdown-it-sanitizer", "0.3.0"
|
||||||
gem "rails-assets-markdown-it-sanitizer", "0.2.2"
|
|
||||||
gem "rails-assets-markdown-it--markdown-it-for-inline", "0.1.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-sub", "1.0.0"
|
||||||
gem "rails-assets-markdown-it-sup", "0.1.0"
|
gem "rails-assets-markdown-it-sup", "1.0.0"
|
||||||
|
|
||||||
# jQuery plugins
|
# jQuery plugins
|
||||||
|
|
||||||
|
|
|
||||||
26
Gemfile.lock
26
Gemfile.lock
|
|
@ -510,15 +510,14 @@ GEM
|
||||||
rails-assets-jquery.slimscroll (1.3.3)
|
rails-assets-jquery.slimscroll (1.3.3)
|
||||||
rails-assets-jquery (>= 1.7)
|
rails-assets-jquery (>= 1.7)
|
||||||
rails-assets-markdown-it--markdown-it-for-inline (0.1.0)
|
rails-assets-markdown-it--markdown-it-for-inline (0.1.0)
|
||||||
rails-assets-markdown-it (3.1.0)
|
rails-assets-markdown-it (4.0.3)
|
||||||
rails-assets-markdown-it-diaspora-mention (0.2.1)
|
rails-assets-markdown-it-diaspora-mention (0.3.0)
|
||||||
rails-assets-markdown-it-hashtag (0.2.3)
|
rails-assets-markdown-it-hashtag (0.3.0)
|
||||||
rails-assets-markdown-it-sanitizer (0.2.2)
|
rails-assets-markdown-it-sanitizer (0.3.0)
|
||||||
rails-assets-markdown-it-sub (0.1.0)
|
rails-assets-markdown-it-sub (1.0.0)
|
||||||
rails-assets-markdown-it-sup (0.1.0)
|
rails-assets-markdown-it-sup (1.0.0)
|
||||||
rails-assets-perfect-scrollbar (0.5.9)
|
rails-assets-perfect-scrollbar (0.5.9)
|
||||||
rails-assets-jquery (>= 1.10)
|
rails-assets-jquery (>= 1.10)
|
||||||
rails-assets-punycode (1.3.2)
|
|
||||||
rails-deprecated_sanitizer (1.0.3)
|
rails-deprecated_sanitizer (1.0.3)
|
||||||
activesupport (>= 4.2.0.alpha)
|
activesupport (>= 4.2.0.alpha)
|
||||||
rails-dom-testing (1.0.6)
|
rails-dom-testing (1.0.6)
|
||||||
|
|
@ -777,15 +776,14 @@ DEPENDENCIES
|
||||||
rails-assets-jquery-idletimer (= 1.0.1)!
|
rails-assets-jquery-idletimer (= 1.0.1)!
|
||||||
rails-assets-jquery-placeholder (= 2.1.1)!
|
rails-assets-jquery-placeholder (= 2.1.1)!
|
||||||
rails-assets-jquery-textchange (= 0.2.3)!
|
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--markdown-it-for-inline (= 0.1.0)!
|
||||||
rails-assets-markdown-it-diaspora-mention (= 0.2.1)!
|
rails-assets-markdown-it-diaspora-mention (= 0.3.0)!
|
||||||
rails-assets-markdown-it-hashtag (= 0.2.3)!
|
rails-assets-markdown-it-hashtag (= 0.3.0)!
|
||||||
rails-assets-markdown-it-sanitizer (= 0.2.2)!
|
rails-assets-markdown-it-sanitizer (= 0.3.0)!
|
||||||
rails-assets-markdown-it-sub (= 0.1.0)!
|
rails-assets-markdown-it-sub (= 1.0.0)!
|
||||||
rails-assets-markdown-it-sup (= 0.1.0)!
|
rails-assets-markdown-it-sup (= 1.0.0)!
|
||||||
rails-assets-perfect-scrollbar (= 0.5.9)!
|
rails-assets-perfect-scrollbar (= 0.5.9)!
|
||||||
rails-assets-punycode (= 1.3.2)!
|
|
||||||
rails-i18n (= 4.0.4)
|
rails-i18n (= 4.0.4)
|
||||||
rails-timeago (= 2.11.0)
|
rails-timeago (= 2.11.0)
|
||||||
rails_admin (= 0.6.7)
|
rails_admin (= 0.6.7)
|
||||||
|
|
|
||||||
|
|
@ -4,28 +4,6 @@
|
||||||
app.helpers.textFormatter = function(text, mentions) {
|
app.helpers.textFormatter = function(text, mentions) {
|
||||||
mentions = mentions ? 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({
|
var md = window.markdownit({
|
||||||
breaks: true,
|
breaks: true,
|
||||||
html: true,
|
html: true,
|
||||||
|
|
@ -41,14 +19,13 @@
|
||||||
.replace(/<3/g, "♥");
|
.replace(/<3/g, "♥");
|
||||||
});
|
});
|
||||||
|
|
||||||
md.use(inlinePlugin, 'link_new_window_and_punycode', 'link_open', function (tokens, idx) {
|
md.use(inlinePlugin, 'link_new_window_and_missing_http', 'link_open', function (tokens, idx) {
|
||||||
tokens[idx].href = tokens[idx].href.replace(/^www\./, "http://www.");
|
tokens[idx].attrs.forEach(function(attribute, index, array) {
|
||||||
tokens[idx].href = punycodeURL(tokens[idx].href);
|
if( attribute[0] === 'href' ) {
|
||||||
tokens[idx].target = "_blank";
|
array[index][1] = attribute[1].replace(/^www\./, "http://www.");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
tokens[idx].attrPush([ 'target', "_blank" ]);
|
||||||
md.use(inlinePlugin, 'image_punycode', 'image', function (tokens, idx) {
|
|
||||||
tokens[idx].src = punycodeURL(tokens[idx].src);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var hashtagPlugin = window.markdownitHashtag;
|
var hashtagPlugin = window.markdownitHashtag;
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,6 @@
|
||||||
//= require markdown-it-sanitizer
|
//= require markdown-it-sanitizer
|
||||||
//= require markdown-it-sub
|
//= require markdown-it-sub
|
||||||
//= require markdown-it-sup
|
//= require markdown-it-sup
|
||||||
//= require punycode
|
|
||||||
//= require parse_url
|
|
||||||
//= require clear-form
|
//= require clear-form
|
||||||
//= require app/app
|
//= require app/app
|
||||||
//= require diaspora
|
//= require diaspora
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,7 @@ describe("app.helpers.textFormatter", function(){
|
||||||
it("adds a missing http://", function() {
|
it("adds a missing http://", function() {
|
||||||
expect(this.formatter('[test](www.google.com)')).toContain('href="http://www.google.com"');
|
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('[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() {
|
it("respects code blocks", function() {
|
||||||
|
|
@ -185,6 +186,13 @@ describe("app.helpers.textFormatter", function(){
|
||||||
}, this);
|
}, this);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("correctly encodes image src to punycode", function() {
|
||||||
|
_.each(this.evilUrls, function(url, num) {
|
||||||
|
var text = this.formatter("");
|
||||||
|
expect(text).toContain(this.asciiUrls[num]);
|
||||||
|
}, this);
|
||||||
|
});
|
||||||
|
|
||||||
it("doesn't break link texts", function() {
|
it("doesn't break link texts", function() {
|
||||||
var linkText = "check out this awesome link!";
|
var linkText = "check out this awesome link!";
|
||||||
var text = this.formatter( "["+linkText+"]("+this.evilUrls[0]+")" );
|
var text = this.formatter( "["+linkText+"]("+this.evilUrls[0]+")" );
|
||||||
|
|
@ -251,12 +259,6 @@ describe("app.helpers.textFormatter", function(){
|
||||||
var parsed = this.formatter(this.input);
|
var parsed = this.formatter(this.input);
|
||||||
expect(parsed).toContain(this.correctHref);
|
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() {
|
it("doesn't fail for misc urls", function() {
|
||||||
|
|
|
||||||
88
vendor/assets/javascripts/parse_url.js
vendored
88
vendor/assets/javascripts/parse_url.js
vendored
|
|
@ -1,88 +0,0 @@
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
Loading…
Reference in a new issue