mirror of
https://github.com/rr-/szurubooru.git
synced 2025-07-17 08:26:24 +00:00
Switched to spaces
This commit is contained in:
@ -2,146 +2,146 @@ var App = App || {};
|
||||
App.Util = App.Util || {};
|
||||
|
||||
App.Util.Draggable = function(jQuery) {
|
||||
var KEY_LEFT = 37;
|
||||
var KEY_UP = 38;
|
||||
var KEY_RIGHT = 39;
|
||||
var KEY_DOWN = 40;
|
||||
var KEY_LEFT = 37;
|
||||
var KEY_UP = 38;
|
||||
var KEY_RIGHT = 39;
|
||||
var KEY_DOWN = 40;
|
||||
|
||||
function relativeDragStrategy($element) {
|
||||
var $parent = $element.parent();
|
||||
var delta;
|
||||
var x = $element.offset().left - $parent.offset().left;
|
||||
var y = $element.offset().top - $parent.offset().top;
|
||||
function relativeDragStrategy($element) {
|
||||
var $parent = $element.parent();
|
||||
var delta;
|
||||
var x = $element.offset().left - $parent.offset().left;
|
||||
var y = $element.offset().top - $parent.offset().top;
|
||||
|
||||
var getPosition = function() {
|
||||
return {x: x, y: y};
|
||||
};
|
||||
var getPosition = function() {
|
||||
return {x: x, y: y};
|
||||
};
|
||||
|
||||
var setPosition = function(newX, newY) {
|
||||
x = newX;
|
||||
y = newY;
|
||||
var screenX = Math.min(Math.max(newX, 0), $parent.outerWidth() - $element.outerWidth());
|
||||
var screenY = Math.min(Math.max(newY, 0), $parent.outerHeight() - $element.outerHeight());
|
||||
screenX *= 100.0 / $parent.outerWidth();
|
||||
screenY *= 100.0 / $parent.outerHeight();
|
||||
$element.css({
|
||||
left: screenX + '%',
|
||||
top: screenY + '%'});
|
||||
};
|
||||
var setPosition = function(newX, newY) {
|
||||
x = newX;
|
||||
y = newY;
|
||||
var screenX = Math.min(Math.max(newX, 0), $parent.outerWidth() - $element.outerWidth());
|
||||
var screenY = Math.min(Math.max(newY, 0), $parent.outerHeight() - $element.outerHeight());
|
||||
screenX *= 100.0 / $parent.outerWidth();
|
||||
screenY *= 100.0 / $parent.outerHeight();
|
||||
$element.css({
|
||||
left: screenX + '%',
|
||||
top: screenY + '%'});
|
||||
};
|
||||
|
||||
return {
|
||||
mouseClicked: function(e) {
|
||||
delta = {
|
||||
x: $element.offset().left - e.clientX,
|
||||
y: $element.offset().top - e.clientY,
|
||||
};
|
||||
},
|
||||
return {
|
||||
mouseClicked: function(e) {
|
||||
delta = {
|
||||
x: $element.offset().left - e.clientX,
|
||||
y: $element.offset().top - e.clientY,
|
||||
};
|
||||
},
|
||||
|
||||
mouseMoved: function(e) {
|
||||
setPosition(
|
||||
e.clientX + delta.x - $parent.offset().left,
|
||||
e.clientY + delta.y - $parent.offset().top);
|
||||
},
|
||||
mouseMoved: function(e) {
|
||||
setPosition(
|
||||
e.clientX + delta.x - $parent.offset().left,
|
||||
e.clientY + delta.y - $parent.offset().top);
|
||||
},
|
||||
|
||||
getPosition: getPosition,
|
||||
setPosition: setPosition,
|
||||
};
|
||||
}
|
||||
getPosition: getPosition,
|
||||
setPosition: setPosition,
|
||||
};
|
||||
}
|
||||
|
||||
function absoluteDragStrategy($element) {
|
||||
var delta;
|
||||
var x = $element.offset().left;
|
||||
var y = $element.offset().top;
|
||||
function absoluteDragStrategy($element) {
|
||||
var delta;
|
||||
var x = $element.offset().left;
|
||||
var y = $element.offset().top;
|
||||
|
||||
var getPosition = function() {
|
||||
return {x: x, y: y};
|
||||
};
|
||||
var getPosition = function() {
|
||||
return {x: x, y: y};
|
||||
};
|
||||
|
||||
var setPosition = function(newX, newY) {
|
||||
x = newX;
|
||||
y = newY;
|
||||
$element.css({
|
||||
left: x + 'px',
|
||||
top: y + 'px'});
|
||||
};
|
||||
var setPosition = function(newX, newY) {
|
||||
x = newX;
|
||||
y = newY;
|
||||
$element.css({
|
||||
left: x + 'px',
|
||||
top: y + 'px'});
|
||||
};
|
||||
|
||||
return {
|
||||
mouseClicked: function(e) {
|
||||
delta = {
|
||||
x: $element.position().left - e.clientX,
|
||||
y: $element.position().top - e.clientY,
|
||||
};
|
||||
},
|
||||
return {
|
||||
mouseClicked: function(e) {
|
||||
delta = {
|
||||
x: $element.position().left - e.clientX,
|
||||
y: $element.position().top - e.clientY,
|
||||
};
|
||||
},
|
||||
|
||||
mouseMoved: function(e) {
|
||||
setPosition(e.clientX + delta.x, e.clientY + delta.y);
|
||||
},
|
||||
mouseMoved: function(e) {
|
||||
setPosition(e.clientX + delta.x, e.clientY + delta.y);
|
||||
},
|
||||
|
||||
getPosition: getPosition,
|
||||
setPosition: setPosition,
|
||||
};
|
||||
}
|
||||
getPosition: getPosition,
|
||||
setPosition: setPosition,
|
||||
};
|
||||
}
|
||||
|
||||
function makeDraggable($element, dragStrategy, enableHotkeys) {
|
||||
var strategy = dragStrategy($element);
|
||||
$element.data('drag-strategy', strategy);
|
||||
function makeDraggable($element, dragStrategy, enableHotkeys) {
|
||||
var strategy = dragStrategy($element);
|
||||
$element.data('drag-strategy', strategy);
|
||||
|
||||
$element.addClass('draggable');
|
||||
$element.addClass('draggable');
|
||||
|
||||
$element.mousedown(function(e) {
|
||||
if (e.target !== $element.get(0)) {
|
||||
return;
|
||||
}
|
||||
e.preventDefault();
|
||||
$element.focus();
|
||||
$element.addClass('dragging');
|
||||
$element.mousedown(function(e) {
|
||||
if (e.target !== $element.get(0)) {
|
||||
return;
|
||||
}
|
||||
e.preventDefault();
|
||||
$element.focus();
|
||||
$element.addClass('dragging');
|
||||
|
||||
strategy.mouseClicked(e);
|
||||
jQuery(window).bind('mousemove.elemmove', function(e) {
|
||||
strategy.mouseMoved(e);
|
||||
}).bind('mouseup.elemmove', function(e) {
|
||||
e.preventDefault();
|
||||
strategy.mouseMoved(e);
|
||||
$element.removeClass('dragging');
|
||||
jQuery(window).unbind('mousemove.elemmove');
|
||||
jQuery(window).unbind('mouseup.elemmove');
|
||||
});
|
||||
});
|
||||
strategy.mouseClicked(e);
|
||||
jQuery(window).bind('mousemove.elemmove', function(e) {
|
||||
strategy.mouseMoved(e);
|
||||
}).bind('mouseup.elemmove', function(e) {
|
||||
e.preventDefault();
|
||||
strategy.mouseMoved(e);
|
||||
$element.removeClass('dragging');
|
||||
jQuery(window).unbind('mousemove.elemmove');
|
||||
jQuery(window).unbind('mouseup.elemmove');
|
||||
});
|
||||
});
|
||||
|
||||
if (enableHotkeys) {
|
||||
$element.keydown(function(e) {
|
||||
var position = strategy.getPosition();
|
||||
var oldPosition = {x: position.x, y: position.y};
|
||||
if (e.shiftKey) {
|
||||
return;
|
||||
}
|
||||
if (enableHotkeys) {
|
||||
$element.keydown(function(e) {
|
||||
var position = strategy.getPosition();
|
||||
var oldPosition = {x: position.x, y: position.y};
|
||||
if (e.shiftKey) {
|
||||
return;
|
||||
}
|
||||
|
||||
var delta = e.ctrlKey ? 10 : 1;
|
||||
if (e.which === KEY_LEFT) {
|
||||
position.x -= delta;
|
||||
} else if (e.which === KEY_RIGHT) {
|
||||
position.x += delta;
|
||||
} else if (e.which === KEY_UP) {
|
||||
position.y -= delta;
|
||||
} else if (e.which === KEY_DOWN) {
|
||||
position.y += delta;
|
||||
}
|
||||
var delta = e.ctrlKey ? 10 : 1;
|
||||
if (e.which === KEY_LEFT) {
|
||||
position.x -= delta;
|
||||
} else if (e.which === KEY_RIGHT) {
|
||||
position.x += delta;
|
||||
} else if (e.which === KEY_UP) {
|
||||
position.y -= delta;
|
||||
} else if (e.which === KEY_DOWN) {
|
||||
position.y += delta;
|
||||
}
|
||||
|
||||
if (position.x !== oldPosition.x || position.y !== oldPosition.y) {
|
||||
e.stopPropagation();
|
||||
e.stopImmediatePropagation();
|
||||
e.preventDefault();
|
||||
strategy.setPosition(position.x, position.y);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
if (position.x !== oldPosition.x || position.y !== oldPosition.y) {
|
||||
e.stopPropagation();
|
||||
e.stopImmediatePropagation();
|
||||
e.preventDefault();
|
||||
strategy.setPosition(position.x, position.y);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
makeDraggable: makeDraggable,
|
||||
absoluteDragStrategy: absoluteDragStrategy,
|
||||
relativeDragStrategy: relativeDragStrategy,
|
||||
};
|
||||
return {
|
||||
makeDraggable: makeDraggable,
|
||||
absoluteDragStrategy: absoluteDragStrategy,
|
||||
relativeDragStrategy: relativeDragStrategy,
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
@ -3,265 +3,265 @@ App.Util = App.Util || {};
|
||||
|
||||
App.Util.Misc = function(_, jQuery, marked, promise) {
|
||||
|
||||
var exitConfirmationEnabled = false;
|
||||
var exitConfirmationEnabled = false;
|
||||
|
||||
function transparentPixel() {
|
||||
return 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
|
||||
}
|
||||
function transparentPixel() {
|
||||
return 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
|
||||
}
|
||||
|
||||
function enableExitConfirmation() {
|
||||
exitConfirmationEnabled = true;
|
||||
jQuery(window).bind('beforeunload', function(e) {
|
||||
return 'There are unsaved changes.';
|
||||
});
|
||||
}
|
||||
function enableExitConfirmation() {
|
||||
exitConfirmationEnabled = true;
|
||||
jQuery(window).bind('beforeunload', function(e) {
|
||||
return 'There are unsaved changes.';
|
||||
});
|
||||
}
|
||||
|
||||
function disableExitConfirmation() {
|
||||
exitConfirmationEnabled = false;
|
||||
jQuery(window).unbind('beforeunload');
|
||||
}
|
||||
function disableExitConfirmation() {
|
||||
exitConfirmationEnabled = false;
|
||||
jQuery(window).unbind('beforeunload');
|
||||
}
|
||||
|
||||
function isExitConfirmationEnabled() {
|
||||
return exitConfirmationEnabled;
|
||||
}
|
||||
function isExitConfirmationEnabled() {
|
||||
return exitConfirmationEnabled;
|
||||
}
|
||||
|
||||
function loadImagesNicely($img) {
|
||||
if (!$img.get(0).complete) {
|
||||
$img.addClass('loading');
|
||||
$img.css({opacity: 0});
|
||||
var $div = jQuery('<div>Loading ' + $img.attr('alt') + '…</div>');
|
||||
var width = $img.width();
|
||||
var height = $img.height();
|
||||
if (width > 50 && height > 50) {
|
||||
$div.css({
|
||||
position: 'absolute',
|
||||
width: width + 'px',
|
||||
height: height + 'px',
|
||||
color: 'rgba(0, 0, 0, 0.15)',
|
||||
zIndex: -1,
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
textAlign: 'center'});
|
||||
$div.insertBefore($img);
|
||||
$div.offset($img.offset());
|
||||
}
|
||||
$img.bind('load', function() {
|
||||
$img.animate({opacity: 1}, 'fast');
|
||||
$img.removeClass('loading');
|
||||
$div.fadeOut($div.remove);
|
||||
});
|
||||
}
|
||||
}
|
||||
function loadImagesNicely($img) {
|
||||
if (!$img.get(0).complete) {
|
||||
$img.addClass('loading');
|
||||
$img.css({opacity: 0});
|
||||
var $div = jQuery('<div>Loading ' + $img.attr('alt') + '…</div>');
|
||||
var width = $img.width();
|
||||
var height = $img.height();
|
||||
if (width > 50 && height > 50) {
|
||||
$div.css({
|
||||
position: 'absolute',
|
||||
width: width + 'px',
|
||||
height: height + 'px',
|
||||
color: 'rgba(0, 0, 0, 0.15)',
|
||||
zIndex: -1,
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
textAlign: 'center'});
|
||||
$div.insertBefore($img);
|
||||
$div.offset($img.offset());
|
||||
}
|
||||
$img.bind('load', function() {
|
||||
$img.animate({opacity: 1}, 'fast');
|
||||
$img.removeClass('loading');
|
||||
$div.fadeOut($div.remove);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function promiseTemplate(templateName) {
|
||||
return promiseTemplateFromDOM(templateName) ||
|
||||
promiseTemplateWithAJAX(templateName);
|
||||
}
|
||||
function promiseTemplate(templateName) {
|
||||
return promiseTemplateFromDOM(templateName) ||
|
||||
promiseTemplateWithAJAX(templateName);
|
||||
}
|
||||
|
||||
function promiseTemplateFromDOM(templateName) {
|
||||
var $template = jQuery('#' + templateName + '-template');
|
||||
if ($template.length) {
|
||||
return promise.make(function(resolve, reject) {
|
||||
resolve(_.template($template.html()));
|
||||
});
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function promiseTemplateFromDOM(templateName) {
|
||||
var $template = jQuery('#' + templateName + '-template');
|
||||
if ($template.length) {
|
||||
return promise.make(function(resolve, reject) {
|
||||
resolve(_.template($template.html()));
|
||||
});
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function promiseTemplateWithAJAX(templateName) {
|
||||
return promise.make(function(resolve, reject) {
|
||||
var templatesDir = '/templates';
|
||||
var templateUrl = templatesDir + '/' + templateName + '.tpl';
|
||||
function promiseTemplateWithAJAX(templateName) {
|
||||
return promise.make(function(resolve, reject) {
|
||||
var templatesDir = '/templates';
|
||||
var templateUrl = templatesDir + '/' + templateName + '.tpl';
|
||||
|
||||
jQuery.ajax({
|
||||
url: templateUrl,
|
||||
method: 'GET',
|
||||
success: function(data, textStatus, xhr) {
|
||||
resolve(_.template(data));
|
||||
},
|
||||
error: function(xhr, textStatus, errorThrown) {
|
||||
console.log(new Error('Error while loading template ' + templateName + ': ' + errorThrown));
|
||||
reject();
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
jQuery.ajax({
|
||||
url: templateUrl,
|
||||
method: 'GET',
|
||||
success: function(data, textStatus, xhr) {
|
||||
resolve(_.template(data));
|
||||
},
|
||||
error: function(xhr, textStatus, errorThrown) {
|
||||
console.log(new Error('Error while loading template ' + templateName + ': ' + errorThrown));
|
||||
reject();
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function formatRelativeTime(timeString) {
|
||||
if (!timeString) {
|
||||
return 'never';
|
||||
}
|
||||
function formatRelativeTime(timeString) {
|
||||
if (!timeString) {
|
||||
return 'never';
|
||||
}
|
||||
|
||||
var then = Date.parse(timeString);
|
||||
var now = Date.now();
|
||||
var difference = Math.abs(now - then);
|
||||
var future = now < then;
|
||||
var then = Date.parse(timeString);
|
||||
var now = Date.now();
|
||||
var difference = Math.abs(now - then);
|
||||
var future = now < then;
|
||||
|
||||
var text = (function(difference) {
|
||||
var mul = 1000;
|
||||
var prevMul;
|
||||
var text = (function(difference) {
|
||||
var mul = 1000;
|
||||
var prevMul;
|
||||
|
||||
mul *= 60;
|
||||
if (difference < mul) {
|
||||
return 'a few seconds';
|
||||
} else if (difference < mul * 2) {
|
||||
return 'a minute';
|
||||
}
|
||||
mul *= 60;
|
||||
if (difference < mul) {
|
||||
return 'a few seconds';
|
||||
} else if (difference < mul * 2) {
|
||||
return 'a minute';
|
||||
}
|
||||
|
||||
prevMul = mul; mul *= 60;
|
||||
if (difference < mul) {
|
||||
return Math.round(difference / prevMul) + ' minutes';
|
||||
} else if (difference < mul * 2) {
|
||||
return 'an hour';
|
||||
}
|
||||
prevMul = mul; mul *= 60;
|
||||
if (difference < mul) {
|
||||
return Math.round(difference / prevMul) + ' minutes';
|
||||
} else if (difference < mul * 2) {
|
||||
return 'an hour';
|
||||
}
|
||||
|
||||
prevMul = mul; mul *= 24;
|
||||
if (difference < mul) {
|
||||
return Math.round(difference / prevMul) + ' hours';
|
||||
} else if (difference < mul * 2) {
|
||||
return 'a day';
|
||||
}
|
||||
prevMul = mul; mul *= 24;
|
||||
if (difference < mul) {
|
||||
return Math.round(difference / prevMul) + ' hours';
|
||||
} else if (difference < mul * 2) {
|
||||
return 'a day';
|
||||
}
|
||||
|
||||
prevMul = mul; mul *= 30.42;
|
||||
if (difference < mul) {
|
||||
return Math.round(difference / prevMul) + ' days';
|
||||
} else if (difference < mul * 2) {
|
||||
return 'a month';
|
||||
}
|
||||
prevMul = mul; mul *= 30.42;
|
||||
if (difference < mul) {
|
||||
return Math.round(difference / prevMul) + ' days';
|
||||
} else if (difference < mul * 2) {
|
||||
return 'a month';
|
||||
}
|
||||
|
||||
prevMul = mul; mul *= 12;
|
||||
if (difference < mul) {
|
||||
return Math.round(difference / prevMul) + ' months';
|
||||
} else if (difference < mul * 2) {
|
||||
return 'a year';
|
||||
}
|
||||
prevMul = mul; mul *= 12;
|
||||
if (difference < mul) {
|
||||
return Math.round(difference / prevMul) + ' months';
|
||||
} else if (difference < mul * 2) {
|
||||
return 'a year';
|
||||
}
|
||||
|
||||
return Math.round(difference / mul) + ' years';
|
||||
})(difference);
|
||||
return Math.round(difference / mul) + ' years';
|
||||
})(difference);
|
||||
|
||||
if (text === 'a day') {
|
||||
return future ? 'tomorrow' : 'yesterday';
|
||||
}
|
||||
return future ? 'in ' + text : text + ' ago';
|
||||
}
|
||||
if (text === 'a day') {
|
||||
return future ? 'tomorrow' : 'yesterday';
|
||||
}
|
||||
return future ? 'in ' + text : text + ' ago';
|
||||
}
|
||||
|
||||
function formatAbsoluteTime(timeString) {
|
||||
var time = new Date(Date.parse(timeString));
|
||||
return time.toString();
|
||||
}
|
||||
function formatAbsoluteTime(timeString) {
|
||||
var time = new Date(Date.parse(timeString));
|
||||
return time.toString();
|
||||
}
|
||||
|
||||
function formatUnits(number, base, suffixes, callback) {
|
||||
if (!number && number !== 0) {
|
||||
return NaN;
|
||||
}
|
||||
number *= 1.0;
|
||||
function formatUnits(number, base, suffixes, callback) {
|
||||
if (!number && number !== 0) {
|
||||
return NaN;
|
||||
}
|
||||
number *= 1.0;
|
||||
|
||||
var suffix = suffixes.shift();
|
||||
while (number >= base && suffixes.length > 0) {
|
||||
suffix = suffixes.shift();
|
||||
number /= base;
|
||||
}
|
||||
var suffix = suffixes.shift();
|
||||
while (number >= base && suffixes.length > 0) {
|
||||
suffix = suffixes.shift();
|
||||
number /= base;
|
||||
}
|
||||
|
||||
if (typeof(callback) === 'undefined') {
|
||||
callback = function(number, suffix) {
|
||||
return suffix ? number.toFixed(1) + suffix : number;
|
||||
};
|
||||
}
|
||||
if (typeof(callback) === 'undefined') {
|
||||
callback = function(number, suffix) {
|
||||
return suffix ? number.toFixed(1) + suffix : number;
|
||||
};
|
||||
}
|
||||
|
||||
return callback(number, suffix);
|
||||
}
|
||||
return callback(number, suffix);
|
||||
}
|
||||
|
||||
function formatFileSize(fileSize) {
|
||||
return formatUnits(
|
||||
fileSize,
|
||||
1024,
|
||||
['B', 'K', 'M', 'G'],
|
||||
function(number, suffix) {
|
||||
var decimalPlaces = number < 20 && suffix !== 'B' ? 1 : 0;
|
||||
return number.toFixed(decimalPlaces) + suffix;
|
||||
});
|
||||
}
|
||||
function formatFileSize(fileSize) {
|
||||
return formatUnits(
|
||||
fileSize,
|
||||
1024,
|
||||
['B', 'K', 'M', 'G'],
|
||||
function(number, suffix) {
|
||||
var decimalPlaces = number < 20 && suffix !== 'B' ? 1 : 0;
|
||||
return number.toFixed(decimalPlaces) + suffix;
|
||||
});
|
||||
}
|
||||
|
||||
function formatMarkdown(text) {
|
||||
var renderer = new marked.Renderer();
|
||||
function formatMarkdown(text) {
|
||||
var renderer = new marked.Renderer();
|
||||
|
||||
var options = {
|
||||
renderer: renderer,
|
||||
breaks: true,
|
||||
sanitize: true,
|
||||
smartypants: true,
|
||||
};
|
||||
var options = {
|
||||
renderer: renderer,
|
||||
breaks: true,
|
||||
sanitize: true,
|
||||
smartypants: true,
|
||||
};
|
||||
|
||||
var preDecorator = function(text) {
|
||||
//prevent ^#... from being treated as headers, due to tag permalinks
|
||||
text = text.replace(/^#/g, '%%%#');
|
||||
//fix \ before ~ being stripped away
|
||||
text = text.replace(/\\~/g, '%%%T');
|
||||
return text;
|
||||
};
|
||||
var preDecorator = function(text) {
|
||||
//prevent ^#... from being treated as headers, due to tag permalinks
|
||||
text = text.replace(/^#/g, '%%%#');
|
||||
//fix \ before ~ being stripped away
|
||||
text = text.replace(/\\~/g, '%%%T');
|
||||
return text;
|
||||
};
|
||||
|
||||
var postDecorator = function(text) {
|
||||
//restore fixes
|
||||
text = text.replace(/%%%T/g, '\\~');
|
||||
text = text.replace(/%%%#/g, '#');
|
||||
var postDecorator = function(text) {
|
||||
//restore fixes
|
||||
text = text.replace(/%%%T/g, '\\~');
|
||||
text = text.replace(/%%%#/g, '#');
|
||||
|
||||
//search permalinks
|
||||
text = text.replace(/\[search\]((?:[^\[]|\[(?!\/?search\]))+)\[\/search\]/ig, '<a href="#/posts/query=$1"><code>$1</code></a>');
|
||||
//spoilers
|
||||
text = text.replace(/\[spoiler\]((?:[^\[]|\[(?!\/?spoiler\]))+)\[\/spoiler\]/ig, '<span class="spoiler">$1</span>');
|
||||
//[small]
|
||||
text = text.replace(/\[small\]((?:[^\[]|\[(?!\/?small\]))+)\[\/small\]/ig, '<small>$1</small>');
|
||||
//strike-through
|
||||
text = text.replace(/(^|[^\\])(~~|~)([^~]+)\2/g, '$1<del>$3</del>');
|
||||
text = text.replace(/\\~/g, '~');
|
||||
//post premalinks
|
||||
text = text.replace(/(^|[\s<>\(\)\[\]])@(\d+)/g, '$1<a href="#/post/$2"><code>@$2</code></a>');
|
||||
//user permalinks
|
||||
text = text.replace(/(^|[\s<>\(\)\[\]])\+([a-zA-Z0-9_-]+)/g, '$1<a href="#/user/$2"><code>+$2</code></a>');
|
||||
//tag permalinks
|
||||
text = text.replace(/(^|[\s<>\(\)\[\]])\#([^\s<>/\\]+)/g, '$1<a href="#/posts/query=$2"><code>#$2</code></a>');
|
||||
return text;
|
||||
};
|
||||
//search permalinks
|
||||
text = text.replace(/\[search\]((?:[^\[]|\[(?!\/?search\]))+)\[\/search\]/ig, '<a href="#/posts/query=$1"><code>$1</code></a>');
|
||||
//spoilers
|
||||
text = text.replace(/\[spoiler\]((?:[^\[]|\[(?!\/?spoiler\]))+)\[\/spoiler\]/ig, '<span class="spoiler">$1</span>');
|
||||
//[small]
|
||||
text = text.replace(/\[small\]((?:[^\[]|\[(?!\/?small\]))+)\[\/small\]/ig, '<small>$1</small>');
|
||||
//strike-through
|
||||
text = text.replace(/(^|[^\\])(~~|~)([^~]+)\2/g, '$1<del>$3</del>');
|
||||
text = text.replace(/\\~/g, '~');
|
||||
//post premalinks
|
||||
text = text.replace(/(^|[\s<>\(\)\[\]])@(\d+)/g, '$1<a href="#/post/$2"><code>@$2</code></a>');
|
||||
//user permalinks
|
||||
text = text.replace(/(^|[\s<>\(\)\[\]])\+([a-zA-Z0-9_-]+)/g, '$1<a href="#/user/$2"><code>+$2</code></a>');
|
||||
//tag permalinks
|
||||
text = text.replace(/(^|[\s<>\(\)\[\]])\#([^\s<>/\\]+)/g, '$1<a href="#/posts/query=$2"><code>#$2</code></a>');
|
||||
return text;
|
||||
};
|
||||
|
||||
return postDecorator(marked(preDecorator(text), options));
|
||||
}
|
||||
return postDecorator(marked(preDecorator(text), options));
|
||||
}
|
||||
|
||||
function appendComplexRouteParam(baseUri, params) {
|
||||
var result = baseUri + '/';
|
||||
_.each(params, function(v, k) {
|
||||
if (typeof(v) !== 'undefined') {
|
||||
result += k + '=' + v + ';';
|
||||
}
|
||||
});
|
||||
return result.slice(0, -1);
|
||||
}
|
||||
function appendComplexRouteParam(baseUri, params) {
|
||||
var result = baseUri + '/';
|
||||
_.each(params, function(v, k) {
|
||||
if (typeof(v) !== 'undefined') {
|
||||
result += k + '=' + v + ';';
|
||||
}
|
||||
});
|
||||
return result.slice(0, -1);
|
||||
}
|
||||
|
||||
function simplifySearchQuery(query) {
|
||||
if (typeof(query) === 'undefined') {
|
||||
return {};
|
||||
}
|
||||
if (query.page === 1) {
|
||||
delete query.page;
|
||||
}
|
||||
query = _.pick(query, _.identity); //remove falsy values
|
||||
return query;
|
||||
}
|
||||
function simplifySearchQuery(query) {
|
||||
if (typeof(query) === 'undefined') {
|
||||
return {};
|
||||
}
|
||||
if (query.page === 1) {
|
||||
delete query.page;
|
||||
}
|
||||
query = _.pick(query, _.identity); //remove falsy values
|
||||
return query;
|
||||
}
|
||||
|
||||
return {
|
||||
promiseTemplate: promiseTemplate,
|
||||
formatRelativeTime: formatRelativeTime,
|
||||
formatAbsoluteTime: formatAbsoluteTime,
|
||||
formatFileSize: formatFileSize,
|
||||
formatMarkdown: formatMarkdown,
|
||||
enableExitConfirmation: enableExitConfirmation,
|
||||
disableExitConfirmation: disableExitConfirmation,
|
||||
isExitConfirmationEnabled: isExitConfirmationEnabled,
|
||||
transparentPixel: transparentPixel,
|
||||
loadImagesNicely: loadImagesNicely,
|
||||
appendComplexRouteParam: appendComplexRouteParam,
|
||||
simplifySearchQuery: simplifySearchQuery,
|
||||
};
|
||||
return {
|
||||
promiseTemplate: promiseTemplate,
|
||||
formatRelativeTime: formatRelativeTime,
|
||||
formatAbsoluteTime: formatAbsoluteTime,
|
||||
formatFileSize: formatFileSize,
|
||||
formatMarkdown: formatMarkdown,
|
||||
enableExitConfirmation: enableExitConfirmation,
|
||||
disableExitConfirmation: disableExitConfirmation,
|
||||
isExitConfirmationEnabled: isExitConfirmationEnabled,
|
||||
transparentPixel: transparentPixel,
|
||||
loadImagesNicely: loadImagesNicely,
|
||||
appendComplexRouteParam: appendComplexRouteParam,
|
||||
simplifySearchQuery: simplifySearchQuery,
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
@ -2,108 +2,108 @@ var App = App || {};
|
||||
App.Util = App.Util || {};
|
||||
|
||||
App.Util.Resizable = function(jQuery) {
|
||||
var KEY_LEFT = 37;
|
||||
var KEY_UP = 38;
|
||||
var KEY_RIGHT = 39;
|
||||
var KEY_DOWN = 40;
|
||||
var KEY_LEFT = 37;
|
||||
var KEY_UP = 38;
|
||||
var KEY_RIGHT = 39;
|
||||
var KEY_DOWN = 40;
|
||||
|
||||
function relativeResizeStrategy($element) {
|
||||
var $parent = $element.parent();
|
||||
var delta;
|
||||
var width = $element.width();
|
||||
var height = $element.height();
|
||||
function relativeResizeStrategy($element) {
|
||||
var $parent = $element.parent();
|
||||
var delta;
|
||||
var width = $element.width();
|
||||
var height = $element.height();
|
||||
|
||||
var getSize = function() {
|
||||
return {width: width, height: height};
|
||||
};
|
||||
var getSize = function() {
|
||||
return {width: width, height: height};
|
||||
};
|
||||
|
||||
var setSize = function(newWidth, newHeight) {
|
||||
width = newWidth;
|
||||
height = newHeight;
|
||||
var screenWidth = Math.min(Math.max(width, 20), $parent.outerWidth() + $parent.offset().left - $element.offset().left);
|
||||
var screenHeight = Math.min(Math.max(height, 20), $parent.outerHeight() + $parent.offset().top - $element.offset().top);
|
||||
screenWidth *= 100.0 / $parent.outerWidth();
|
||||
screenHeight *= 100.0 / $parent.outerHeight();
|
||||
$element.css({
|
||||
width: screenWidth + '%',
|
||||
height: screenHeight + '%'});
|
||||
};
|
||||
var setSize = function(newWidth, newHeight) {
|
||||
width = newWidth;
|
||||
height = newHeight;
|
||||
var screenWidth = Math.min(Math.max(width, 20), $parent.outerWidth() + $parent.offset().left - $element.offset().left);
|
||||
var screenHeight = Math.min(Math.max(height, 20), $parent.outerHeight() + $parent.offset().top - $element.offset().top);
|
||||
screenWidth *= 100.0 / $parent.outerWidth();
|
||||
screenHeight *= 100.0 / $parent.outerHeight();
|
||||
$element.css({
|
||||
width: screenWidth + '%',
|
||||
height: screenHeight + '%'});
|
||||
};
|
||||
|
||||
return {
|
||||
mouseClicked: function(e) {
|
||||
delta = {
|
||||
x: $element.width() - e.clientX,
|
||||
y: $element.height() - e.clientY,
|
||||
};
|
||||
},
|
||||
return {
|
||||
mouseClicked: function(e) {
|
||||
delta = {
|
||||
x: $element.width() - e.clientX,
|
||||
y: $element.height() - e.clientY,
|
||||
};
|
||||
},
|
||||
|
||||
mouseMoved: function(e) {
|
||||
setSize(
|
||||
e.clientX + delta.x,
|
||||
e.clientY + delta.y);
|
||||
},
|
||||
mouseMoved: function(e) {
|
||||
setSize(
|
||||
e.clientX + delta.x,
|
||||
e.clientY + delta.y);
|
||||
},
|
||||
|
||||
getSize: getSize,
|
||||
setSize: setSize,
|
||||
};
|
||||
}
|
||||
getSize: getSize,
|
||||
setSize: setSize,
|
||||
};
|
||||
}
|
||||
|
||||
function makeResizable($element, enableHotkeys) {
|
||||
var $resizer = jQuery('<div class="resizer"></div>');
|
||||
var strategy = relativeResizeStrategy($element);
|
||||
$element.append($resizer);
|
||||
function makeResizable($element, enableHotkeys) {
|
||||
var $resizer = jQuery('<div class="resizer"></div>');
|
||||
var strategy = relativeResizeStrategy($element);
|
||||
$element.append($resizer);
|
||||
|
||||
$resizer.mousedown(function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
$element.focus();
|
||||
$element.addClass('resizing');
|
||||
$resizer.mousedown(function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
$element.focus();
|
||||
$element.addClass('resizing');
|
||||
|
||||
strategy.mouseClicked(e);
|
||||
strategy.mouseClicked(e);
|
||||
|
||||
jQuery(window).bind('mousemove.elemsize', function(e) {
|
||||
strategy.mouseMoved(e);
|
||||
}).bind('mouseup.elemsize', function(e) {
|
||||
e.preventDefault();
|
||||
strategy.mouseMoved(e);
|
||||
$element.removeClass('resizing');
|
||||
jQuery(window).unbind('mousemove.elemsize');
|
||||
jQuery(window).unbind('mouseup.elemsize');
|
||||
});
|
||||
});
|
||||
jQuery(window).bind('mousemove.elemsize', function(e) {
|
||||
strategy.mouseMoved(e);
|
||||
}).bind('mouseup.elemsize', function(e) {
|
||||
e.preventDefault();
|
||||
strategy.mouseMoved(e);
|
||||
$element.removeClass('resizing');
|
||||
jQuery(window).unbind('mousemove.elemsize');
|
||||
jQuery(window).unbind('mouseup.elemsize');
|
||||
});
|
||||
});
|
||||
|
||||
if (enableHotkeys) {
|
||||
$element.keydown(function(e) {
|
||||
var size = strategy.getSize();
|
||||
var oldSize = {width: size.width, height: size.height};
|
||||
if (!e.shiftKey) {
|
||||
return;
|
||||
}
|
||||
if (enableHotkeys) {
|
||||
$element.keydown(function(e) {
|
||||
var size = strategy.getSize();
|
||||
var oldSize = {width: size.width, height: size.height};
|
||||
if (!e.shiftKey) {
|
||||
return;
|
||||
}
|
||||
|
||||
var delta = e.ctrlKey ? 10 : 1;
|
||||
if (e.which === KEY_LEFT) {
|
||||
size.width -= delta;
|
||||
} else if (e.which === KEY_RIGHT) {
|
||||
size.width += delta;
|
||||
} else if (e.which === KEY_UP) {
|
||||
size.height -= delta;
|
||||
} else if (e.which === KEY_DOWN) {
|
||||
size.height += delta;
|
||||
}
|
||||
var delta = e.ctrlKey ? 10 : 1;
|
||||
if (e.which === KEY_LEFT) {
|
||||
size.width -= delta;
|
||||
} else if (e.which === KEY_RIGHT) {
|
||||
size.width += delta;
|
||||
} else if (e.which === KEY_UP) {
|
||||
size.height -= delta;
|
||||
} else if (e.which === KEY_DOWN) {
|
||||
size.height += delta;
|
||||
}
|
||||
|
||||
if (size.width !== oldSize.width || size.height !== oldSize.height) {
|
||||
e.stopPropagation();
|
||||
e.stopImmediatePropagation();
|
||||
e.preventDefault();
|
||||
strategy.setSize(size.width, size.height);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
if (size.width !== oldSize.width || size.height !== oldSize.height) {
|
||||
e.stopPropagation();
|
||||
e.stopImmediatePropagation();
|
||||
e.preventDefault();
|
||||
strategy.setSize(size.width, size.height);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
makeResizable: makeResizable,
|
||||
};
|
||||
return {
|
||||
makeResizable: makeResizable,
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user