Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Finish uplaod resize function (#137)
configurable, some fixes, polyfill for chrome
- Loading branch information
Showing
5 changed files
with
221 additions
and
62 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
/* canvas-toBlob.js | ||
* A canvas.toBlob() implementation. | ||
* 2013-12-27 | ||
* | ||
* By Eli Grey, http://eligrey.com and Devin Samarin, https://github.com/eboyjr | ||
* License: X11/MIT | ||
* See LICENSE.md | ||
*/ | ||
|
||
/*global self */ | ||
/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true, | ||
plusplus: true */ | ||
|
||
/*! @source http://purl.eligrey.com/github/canvas-toBlob.js/blob/master/canvas-toBlob.js */ | ||
|
||
(function(view) { | ||
"use strict"; | ||
var | ||
Uint8Array = view.Uint8Array | ||
, HTMLCanvasElement = view.HTMLCanvasElement | ||
, canvas_proto = HTMLCanvasElement && HTMLCanvasElement.prototype | ||
, is_base64_regex = /\s*;\s*base64\s*(?:;|$)/i | ||
, to_data_url = "toDataURL" | ||
, base64_ranks | ||
, decode_base64 = function(base64) { | ||
var | ||
len = base64.length | ||
, buffer = new Uint8Array(len / 4 * 3 | 0) | ||
, i = 0 | ||
, outptr = 0 | ||
, last = [0, 0] | ||
, state = 0 | ||
, save = 0 | ||
, rank | ||
, code | ||
, undef | ||
; | ||
while (len--) { | ||
code = base64.charCodeAt(i++); | ||
rank = base64_ranks[code-43]; | ||
if (rank !== 255 && rank !== undef) { | ||
last[1] = last[0]; | ||
last[0] = code; | ||
save = (save << 6) | rank; | ||
state++; | ||
if (state === 4) { | ||
buffer[outptr++] = save >>> 16; | ||
if (last[1] !== 61 /* padding character */) { | ||
buffer[outptr++] = save >>> 8; | ||
} | ||
if (last[0] !== 61 /* padding character */) { | ||
buffer[outptr++] = save; | ||
} | ||
state = 0; | ||
} | ||
} | ||
} | ||
// 2/3 chance there's going to be some null bytes at the end, but that | ||
// doesn't really matter with most image formats. | ||
// If it somehow matters for you, truncate the buffer up outptr. | ||
return buffer; | ||
} | ||
; | ||
if (Uint8Array) { | ||
base64_ranks = new Uint8Array([ | ||
62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1 | ||
, -1, -1, 0, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 | ||
, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 | ||
, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 | ||
, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 | ||
]); | ||
} | ||
if (HTMLCanvasElement && !canvas_proto.toBlob) { | ||
canvas_proto.toBlob = function(callback, type /*, ...args*/) { | ||
if (!type) { | ||
type = "image/png"; | ||
} if (this.mozGetAsFile) { | ||
callback(this.mozGetAsFile("canvas", type)); | ||
return; | ||
} | ||
var | ||
args = Array.prototype.slice.call(arguments, 1) | ||
, dataURI = this[to_data_url].apply(this, args) | ||
, header_end = dataURI.indexOf(",") | ||
, data = dataURI.substring(header_end + 1) | ||
, is_base64 = is_base64_regex.test(dataURI.substring(0, header_end)) | ||
, blob | ||
; | ||
if (Blob.fake) { | ||
// no reason to decode a data: URI that's just going to become a data URI again | ||
blob = new Blob | ||
if (is_base64) { | ||
blob.encoding = "base64"; | ||
} else { | ||
blob.encoding = "URI"; | ||
} | ||
blob.data = data; | ||
blob.size = data.length; | ||
} else if (Uint8Array) { | ||
if (is_base64) { | ||
blob = new Blob([decode_base64(data)], {type: type}); | ||
} else { | ||
blob = new Blob([decodeURIComponent(data)], {type: type}); | ||
} | ||
} | ||
callback(blob); | ||
}; | ||
|
||
if (canvas_proto.toDataURLHD) { | ||
canvas_proto.toBlobHD = function() { | ||
to_data_url = "toDataURLHD"; | ||
var blob = this.toBlob(); | ||
to_data_url = "toDataURL"; | ||
return blob; | ||
} | ||
} else { | ||
canvas_proto.toBlobHD = canvas_proto.toBlob; | ||
} | ||
} | ||
}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this)); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@yellowled Is there a better way to include the polyfill?
@garvinhicking If we want to keep that, there is still the documentation I would do and the language constants to add (which I would prefer if you could do)
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure what you mean by “better way”. We don't have a backend mechanism for combine/minify yet.
The only other way I can think of would be to use a conditional script loader to only load it if it's actually required (using a Modernizr test to determine that first). Not sure if we want to add a conditional script loader on top of our existing JS. Might be a good topic for the dev talk.
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, that was the direction I was thinking. And, if there is a build-skript to manage those dependencies (grunt-style). Let's talk about it in the devtalk.
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please add the required lang constants with a first text to addlang.txt and I'll commit it to the language files (I don't know what you want inside the text g)
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@garvinhicking I did that in d0b65f2
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this currently work for you? I can't get it to work; I believe I had reported this at some place, it seems the JS code is not parsed into the actual backend JS (index.php?/plugin/admin/serendipity_editor.js)
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll have a look. But the code is now part of the core and of 2k11, it should not be possible that the setting is ignored, as long as the plugin-api works.
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@onli I believe the current problem is that serendipity_editor.js is statically delivered from templates/default/ and it is not delivered dynamically by parsing 2k11/serendipity_editor.js.tpl. Don't know how the whole mechanism is properly meant to work though. I believe it already didn't work before I implemented the frontend/backend separation, but I'm not 100% sure about that.
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That would explain it. The idea of the last version was to never¹ fall back to the static version, as the smarty-parsing is implemented in the core, in 694b446
1: with the possible exception of the installer, that I didn't test yet.
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@onli - What could we do about that? Currently it seems to me that my install properly parses the serendipity_editor.js.tpl, but still the AJAX resizing feature is not working on my installation, the code doesn't show up...
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That is strange, as it works on my system - maybe I just failed to commit something necessary.
Does it never work for you, regardless of the backend template? The configuration value gets saved though?
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, I looked more thoroughly. My settings for image width/height (just above the config option) were set to an empty string. In that case the functionality does not work. Is this how it's supposed to work? Maybe the info-text of the upload-resize option should mention that it relies on the previous two settings?
ccbfcf2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, that is how it is supposed to work, one of the two has to be set. And sure, if I didn't mention that, that is an oversight on my part and should be fixed.
I'm happy though it is nothing more fundamental with the backend-system.