Update markdown-it
This commit is contained in:
parent
ea58c95fa0
commit
adf9bcf8e8
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
|
||||
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
|
||||
|
||||
|
|
|
|||
26
Gemfile.lock
26
Gemfile.lock
|
|
@ -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("");
|
||||
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() {
|
||||
|
|
|
|||
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