Converted project from vcs to ics as default parameters.

This commit is contained in:
Travis
2013-10-11 10:20:13 -08:00
parent b37054a07b
commit af75f16bb6
7 changed files with 67 additions and 432 deletions
+15 -15
View File
@@ -1,28 +1,28 @@
VCS-Maker.js ics.js
============ ============
A browser firendly VCS file generator written entirely in javascript!!!!!! A browser firendly .ics/.vcs file generator written entirely in javascript!!!!!!
Now you can make calendar friendly files client-side. It outputs VCS files, so the files are compatible with all modern calendar software (Outlook, Apple Calendar, Google, etc.) Now you can make calendar friendly files client-side. It outputs .ics files, so the files are compatible with all modern calendar software (Outlook, Apple Calendar, Google, etc.)
How To Use How To Use
---------- ----------
Simply use the function... Simply use the function...
download_vcs(filename, subject, description, location, begin, end); download_ics(filename, subject, description, location, begin, end);
`begin` and `end` need to be formatted in a way that is friendly to `Date()` `begin` and `end` need to be formatted in a way that is friendly to `Date()`
Example Example
------- -------
<a href="javascript:download_vcs('demo', 'Demo Event', 'This is an awesome demo event', 'Sexy Land, AK', '8/7/2013', '8/9/2013')">Demo</a> <a href="javascript:download_ics('demo', 'Demo Event', 'This is an awesome demo event', 'Sexy Land, AK', '8/7/2013', '8/9/2013')">Demo</a>
Dependencies Dependencies
------------ ------------
The tool uses 2 libraries from the following projects: The tool uses 2 libraries from the following projects:
* FileSaver.js (https://github.com/eligrey/FileSaver.js) * [FileSaver.js](https://github.com/eligrey/FileSaver.js)
* Blob.js (https://github.com/eligrey/Blob.js) * [Blob.js](https://github.com/eligrey/Blob.js)
I've compressed them and included them into the source for the normal file. Other variations are available in the repo. I've compressed them and included them into the source for the normal file. Other variations are available in the repo.
@@ -33,11 +33,11 @@ Supported Browsers
| Browser | Constructs as | Filenames | Size | Dependancies | | Browser | Constructs as | Filenames | Size | Dependancies |
| -------------- | ------------- | ------------ | ---------- | ------------ | | -------------- | ------------- | ------------ | ---------- | ------------ |
| Firefox 20+ | Blob | Yes | 800MiB/per | None | | Firefox 20+ | Blob | Yes | 800MiB/per | [FileSaver.js](https://github.com/eligrey/FileSaver.js) |
| Firefox ≤ 19 | data: URI | No | | [Blob.js](https://github.com/eligrey/Blob.js) | | Firefox ≤ 19 | data: URI | No | | [FileSaver.js](https://github.com/eligrey/FileSaver.js), [Blob.js](https://github.com/eligrey/Blob.js) |
| Chrome | Blob | Yes | 345MiB/per | None | | Chrome | Blob | Yes | 345MiB/per | [FileSaver.js](https://github.com/eligrey/FileSaver.js) |
| Chrome for Android v28+ | Blob | Yes | | None | | Chrome for Android v28+ | Blob | Yes | | [FileSaver.js](https://github.com/eligrey/FileSaver.js) |
| IE 10+ | Blob | Yes | 600MiB/per | None | | IE 10+ | Blob | Yes | 600MiB/per | [FileSaver.js](https://github.com/eligrey/FileSaver.js) |
| Opera Next | Blob | Yes | | None | | Opera Next | Blob | Yes | | [FileSaver.js](https://github.com/eligrey/FileSaver.js) |
| Opera < 15 | data: URI | No | | [Blob.js](https://github.com/eligrey/Blob.js) | | Opera < 15 | data: URI | No | | [FileSaver.js](https://github.com/eligrey/FileSaver.js), [Blob.js](https://github.com/eligrey/Blob.js) |
| Safari ≤ 6 | data: URI | No | | [Blob.js](https://github.com/eligrey/Blob.js) | | Safari ≤ 6 | data: URI | No | | [FileSaver.js](https://github.com/eligrey/FileSaver.js), [Blob.js](https://github.com/eligrey/Blob.js) |
+44 -2
View File
@@ -1,8 +1,50 @@
<!DOCTYPE html> <!DOCTYPE html>
<head> <head>
<script type="text/javascript" async="" src="vcs-maker.js"></script> <script type="text/javascript" async="" src="ics-min.js"></script>
<style>
html, body {
height: 100%;
width: 100%;
}
.wrap {
margin: auto;
position: absolute;
top: 0; left: 0; bottom: 0; right: 0;
height: 50px;
width: 100px;
}
a {
margin-top: 5px;
margin-bottom: 5px;
display: inline-block;
padding: 6px 12px;
margin-bottom: 0;
font-size: 14px;
font-weight: normal;
line-height: 1.428571429;
text-align: center;
white-space: nowrap;
vertical-align: middle;
cursor: pointer;
border: 1px solid transparent;
border-radius: 4px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
cursor: pointer;
color: #ffffff;
text-decoration: none;
font-weight: bold;
background-color: #428bca;
border-color: #357ebd;
font-family: sans-serif;
}
</style>
</head> </head>
<body> <body>
<a href="javascript:download_vcs('demo', 'Demo Event', 'This is an awesome demo event', 'Sexy Land, AK', '8/7/2013', '8/9/2013')">Demo</a> <div class="wrap">
<a href="javascript:download_ics('demo', 'Demo Event', 'This is an awesome demo event', 'Sexy Land, AK', '8/7/2013', '8/9/2013')">Demo Event</a>
</div>
</body> </body>
</html> </html>
File diff suppressed because one or more lines are too long
-412
View File
@@ -1,412 +0,0 @@
// FileSaver.js
var BlobBuilder = BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder || (function(view) {
if (navigator.userAgent.indexOf('MSIE') > -1 && navigator.userAgent.indexOf('MSIE 10') == -1) {
console.log('Unsupported Browser');
return;
};
"use strict";
var get_class = function(object) {
return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
}
, FakeBlobBuilder = function(){
this.data = [];
}
, FakeBlob = function(data, type, encoding) {
this.data = data;
this.size = data.length;
this.type = type;
this.encoding = encoding;
}
, FBB_proto = FakeBlobBuilder.prototype
, FB_proto = FakeBlob.prototype
, FileReaderSync = view.FileReaderSync
, FileException = function(type) {
this.code = this[this.name = type];
}
, file_ex_codes = (
"NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
+ "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
).split(" ")
, file_ex_code = file_ex_codes.length
, real_URL = view.URL || view.webkitURL || view
, real_create_object_URL = real_URL.createObjectURL
, real_revoke_object_URL = real_URL.revokeObjectURL
, URL = real_URL
, btoa = view.btoa
, atob = view.atob
, can_apply_typed_arrays = false
, can_apply_typed_arrays_test = function(pass) {
can_apply_typed_arrays = !pass;
}
, ArrayBuffer = view.ArrayBuffer
, Uint8Array = view.Uint8Array
;
FakeBlobBuilder.fake = FB_proto.fake = true;
while (file_ex_code--) {
FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
}
try {
if (Uint8Array) {
can_apply_typed_arrays_test.apply(0, new Uint8Array(1));
}
} catch (ex) {}
if (!real_URL.createObjectURL) {
URL = view.URL = {};
}
URL.createObjectURL = function(blob) {
var
type = blob.type
, data_URI_header
;
if (type === null) {
type = "application/octet-stream";
}
if (blob instanceof FakeBlob) {
data_URI_header = "data:" + type;
if (blob.encoding === "base64") {
return data_URI_header + ";base64," + blob.data;
} else if (blob.encoding === "URI") {
return data_URI_header + "," + decodeURIComponent(blob.data);
} if (btoa) {
return data_URI_header + ";base64," + btoa(blob.data);
} else {
return data_URI_header + "," + encodeURIComponent(blob.data);
}
} else if (real_create_object_URL) {
return real_create_object_URL.call(real_URL, blob);
}
};
URL.revokeObjectURL = function(object_URL) {
if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
real_revoke_object_URL.call(real_URL, object_URL);
}
};
FBB_proto.append = function(data/*, endings*/) {
var bb = this.data;
// decode data to a binary string
if (Uint8Array && data instanceof ArrayBuffer) {
if (can_apply_typed_arrays) {
bb.push(String.fromCharCode.apply(String, new Uint8Array(data)));
} else {
var
str = ""
, buf = new Uint8Array(data)
, i = 0
, buf_len = buf.length
;
for (; i < buf_len; i++) {
str += String.fromCharCode(buf[i]);
}
}
} else if (get_class(data) === "Blob" || get_class(data) === "File") {
if (FileReaderSync) {
var fr = new FileReaderSync;
bb.push(fr.readAsBinaryString(data));
} else {
// async FileReader won't work as BlobBuilder is sync
throw new FileException("NOT_READABLE_ERR");
}
} else if (data instanceof FakeBlob) {
if (data.encoding === "base64" && atob) {
bb.push(atob(data.data));
} else if (data.encoding === "URI") {
bb.push(decodeURIComponent(data.data));
} else if (data.encoding === "raw") {
bb.push(data.data);
}
} else {
if (typeof data !== "string") {
data += ""; // convert unsupported types to strings
}
// decode UTF-16 to binary string
bb.push(unescape(encodeURIComponent(data)));
}
};
FBB_proto.getBlob = function(type) {
if (!arguments.length) {
type = null;
}
return new FakeBlob(this.data.join(""), type, "raw");
};
FBB_proto.toString = function() {
return "[object BlobBuilder]";
};
FB_proto.slice = function(start, end, type) {
var args = arguments.length;
if (args < 3) {
type = null;
}
return new FakeBlob(
this.data.slice(start, args > 1 ? end : this.data.length)
, type
, this.encoding
);
};
FB_proto.toString = function() {
return "[object Blob]";
};
return FakeBlobBuilder;
}(self));
// Blob.js
var saveAs = saveAs
|| (navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
|| (function(view) {
if (navigator.userAgent.indexOf('MSIE') != -1 && navigator.userAgent.indexOf('MSIE 10') == -1) {
console.log('Unsupported Browser');
return;
};
"use strict";
var
doc = view.document
// only get URL when necessary in case BlobBuilder.js hasn't overridden it yet
, get_URL = function() {
return view.URL || view.webkitURL || view;
}
, URL = view.URL || view.webkitURL || view
, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
, can_use_save_link = !view.externalHost && "download" in save_link
, click = function(node) {
var event = doc.createEvent("MouseEvents");
event.initMouseEvent(
"click", true, false, view, 0, 0, 0, 0, 0
, false, false, false, false, 0, null
);
node.dispatchEvent(event);
}
, webkit_req_fs = view.webkitRequestFileSystem
, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
, throw_outside = function (ex) {
(view.setImmediate || view.setTimeout)(function() {
throw ex;
}, 0);
}
, force_saveable_type = "application/octet-stream"
, fs_min_size = 0
, deletion_queue = []
, process_deletion_queue = function() {
var i = deletion_queue.length;
while (i--) {
var file = deletion_queue[i];
if (typeof file === "string") { // file is an object URL
URL.revokeObjectURL(file);
} else { // file is a File
file.remove();
}
}
deletion_queue.length = 0; // clear queue
}
, dispatch = function(filesaver, event_types, event) {
event_types = [].concat(event_types);
var i = event_types.length;
while (i--) {
var listener = filesaver["on" + event_types[i]];
if (typeof listener === "function") {
try {
listener.call(filesaver, event || filesaver);
} catch (ex) {
throw_outside(ex);
}
}
}
}
, FileSaver = function(blob, name) {
// First try a.download, then web filesystem, then object URLs
var
filesaver = this
, type = blob.type
, blob_changed = false
, object_url
, target_view
, get_object_url = function() {
var object_url = get_URL().createObjectURL(blob);
deletion_queue.push(object_url);
return object_url;
}
, dispatch_all = function() {
dispatch(filesaver, "writestart progress write writeend".split(" "));
}
// on any filesys errors revert to saving with object URLs
, fs_error = function() {
// don't create more object URLs than needed
if (blob_changed || !object_url) {
object_url = get_object_url(blob);
}
if (target_view) {
target_view.location.href = object_url;
} else {
window.open(object_url, "_blank");
}
filesaver.readyState = filesaver.DONE;
dispatch_all();
}
, abortable = function(func) {
return function() {
if (filesaver.readyState !== filesaver.DONE) {
return func.apply(this, arguments);
}
};
}
, create_if_not_found = {create: true, exclusive: false}
, slice
;
filesaver.readyState = filesaver.INIT;
if (!name) {
name = "download";
}
if (can_use_save_link) {
object_url = get_object_url(blob);
save_link.href = object_url;
save_link.download = name;
click(save_link);
filesaver.readyState = filesaver.DONE;
dispatch_all();
return;
}
// Object and web filesystem URLs have a problem saving in Google Chrome when
// viewed in a tab, so I force save with application/octet-stream
// http://code.google.com/p/chromium/issues/detail?id=91158
if (view.chrome && type && type !== force_saveable_type) {
slice = blob.slice || blob.webkitSlice;
blob = slice.call(blob, 0, blob.size, force_saveable_type);
blob_changed = true;
}
// Since I can't be sure that the guessed media type will trigger a download
// in WebKit, I append .download to the filename.
// https://bugs.webkit.org/show_bug.cgi?id=65440
if (webkit_req_fs && name !== "download") {
name += ".download";
}
if (type === force_saveable_type || webkit_req_fs) {
target_view = view;
}
if (!req_fs) {
fs_error();
return;
}
fs_min_size += blob.size;
req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
var save = function() {
dir.getFile(name, create_if_not_found, abortable(function(file) {
file.createWriter(abortable(function(writer) {
writer.onwriteend = function(event) {
target_view.location.href = file.toURL();
deletion_queue.push(file);
filesaver.readyState = filesaver.DONE;
dispatch(filesaver, "writeend", event);
};
writer.onerror = function() {
var error = writer.error;
if (error.code !== error.ABORT_ERR) {
fs_error();
}
};
"writestart progress write abort".split(" ").forEach(function(event) {
writer["on" + event] = filesaver["on" + event];
});
writer.write(blob);
filesaver.abort = function() {
writer.abort();
filesaver.readyState = filesaver.DONE;
};
filesaver.readyState = filesaver.WRITING;
}), fs_error);
}), fs_error);
};
dir.getFile(name, {create: false}, abortable(function(file) {
// delete file if it already exists
file.remove();
save();
}), abortable(function(ex) {
if (ex.code === ex.NOT_FOUND_ERR) {
save();
} else {
fs_error();
}
}));
}), fs_error);
}), fs_error);
}
, FS_proto = FileSaver.prototype
, saveAs = function(blob, name) {
return new FileSaver(blob, name);
}
;
FS_proto.abort = function() {
var filesaver = this;
filesaver.readyState = filesaver.DONE;
dispatch(filesaver, "abort");
};
FS_proto.readyState = FS_proto.INIT = 0;
FS_proto.WRITING = 1;
FS_proto.DONE = 2;
FS_proto.error =
FS_proto.onwritestart =
FS_proto.onprogress =
FS_proto.onwrite =
FS_proto.onabort =
FS_proto.onerror =
FS_proto.onwriteend =
null;
view.addEventListener("unload", process_deletion_queue, false);
return saveAs;
}(self));
/* The meat and potatoes! */
download_vcs = function(filename, subject, description, location, begin, end) {
if (navigator.userAgent.indexOf('MSIE') > -1 && navigator.userAgent.indexOf('MSIE 10') == -1) {
console.log('Unsupported Browser');
return;
};
var subject = subject;
var description = description;
var address = location;
var start_date = new Date(begin);
var end_date = new Date(end);
var start_year = ("0000" + (start_date.getFullYear().toString())).slice(-4);
var start_month = ("00" + (start_date.getMonth().toString())).slice(-2);
var start_day = ("00" + (start_date.getDate().toString())).slice(-2);
var start = start_year + start_month + start_day;
var end_year = ("0000" + (end_date.getFullYear().toString())).slice(-4);
var end_month = ("00" + (end_date.getMonth().toString())).slice(-2);
var end_day = ("00" + ((end_date.getDate()+1).toString())).slice(-2);
var end = end_year + end_month + end_day;
var calendar = [
"BEGIN:VCALENDAR",
"VERSION:2.0",
"BEGIN:VEVENT",
"CLASS:PUBLIC",
"DESCRIPTION:"+description,
"DTSTART;VALUE=DATE:"+start,
"DTEND;VALUE=DATE:"+end,
"LOCATION:"+address,
"SUMMARY;LANGUAGE=en-us:"+subject,
"TRANSP:TRANSPARENT",
"END:VEVENT",
"END:VCALENDAR"
].join('\n');
if (navigator.userAgent.indexOf('MSIE 10') > -1) { // chrome or firefox
var blob = new Blob([calendar]);
}
else { // ie
var bb = new BlobBuilder();
bb.append(calendar);
var blob = bb.getBlob("text/x-vCalendar;charset=" + document.characterSet);
}
saveAs(blob, filename+".vcs");
}
+3 -1
View File
@@ -362,7 +362,9 @@ var saveAs = saveAs
/* The meat and potatoes! */ /* The meat and potatoes! */
download_vcs = function(filename, subject, description, location, begin, end, ext='.vcs') { download_ics = function(filename, subject, description, location, begin, end, ext) {
var ext = typeof ext !== 'undefined' ? ext : '.ics';
if (navigator.userAgent.indexOf('MSIE') > -1 && navigator.userAgent.indexOf('MSIE 10') == -1) { if (navigator.userAgent.indexOf('MSIE') > -1 && navigator.userAgent.indexOf('MSIE 10') == -1) {
console.log('Unsupported Browser'); console.log('Unsupported Browser');
return; return;
Vendored
+1
View File
File diff suppressed because one or more lines are too long
+3 -1
View File
@@ -1,5 +1,7 @@
/* VCS-Maker.js */ /* VCS-Maker.js */
download_vcs = function(filename, subject, description, location, begin, end, ext='.vcs') { download_ics = function(filename, subject, description, location, begin, end, ext) {
var ext = typeof ext !== 'undefined' ? ext : '.ics';
if (navigator.userAgent.indexOf('MSIE') > -1 && navigator.userAgent.indexOf('MSIE 10') == -1) { if (navigator.userAgent.indexOf('MSIE') > -1 && navigator.userAgent.indexOf('MSIE 10') == -1) {
console.log('Unsupported Browser'); console.log('Unsupported Browser');
return; return;