Subversion-Projekte lars-tiefland.ci

Revision

Blame | Letzte Änderung | Log anzeigen | RSS feed

/* FileSaver.js demo script
 * 2012-01-23
 * 
 * By Eli Grey, http://eligrey.com
 * License: X11/MIT
 *   See LICENSE.md
 */

/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/demo/demo.js */

(function(view) {
"use strict";
// The canvas drawing portion of the demo is based off the demo at
// http://www.williammalone.com/articles/create-html5-canvas-javascript-drawing-app/
var
          document = view.document
        , $ = function(id) {
                return document.getElementById(id);
        }
        , session = view.sessionStorage
        // only get URL when necessary in case Blob.js hasn't defined it yet
        , get_blob = function() {
                return view.Blob;
        }

        , canvas = $("canvas")
        , canvas_options_form = $("canvas-options")
        , canvas_filename = $("canvas-filename")
        , canvas_clear_button = $("canvas-clear")
        
        , text = $("text")
        , text_options_form = $("text-options")
        , text_filename = $("text-filename")
        
        , html = $("html")
        , html_options_form = $("html-options")
        , html_filename = $("html-filename")
        
        , ctx = canvas.getContext("2d")
        , drawing = false
        , x_points = session.x_points || []
        , y_points = session.y_points || []
        , drag_points = session.drag_points || []
        , add_point = function(x, y, dragging) {
                x_points.push(x);
                y_points.push(y);
                drag_points.push(dragging);
        }
        , draw = function(){
                canvas.width = canvas.width;
                ctx.lineWidth = 6;
                ctx.lineJoin = "round";
                ctx.strokeStyle = "#000000";
                var
                          i = 0
                        , len = x_points.length
                ;
                for(; i < len; i++) {
                        ctx.beginPath();
                        if (i && drag_points[i]) {
                                ctx.moveTo(x_points[i-1], y_points[i-1]);
                        } else {
                                ctx.moveTo(x_points[i]-1, y_points[i]);
                        }
                        ctx.lineTo(x_points[i], y_points[i]);
                        ctx.closePath();
                        ctx.stroke();
                }
        }
        , stop_drawing = function() {
                drawing = false;
        }
        
        // Title guesser and document creator available at https://gist.github.com/1059648
        , guess_title = function(doc) {
                var
                          h = "h6 h5 h4 h3 h2 h1".split(" ")
                        , i = h.length
                        , headers
                        , header_text
                ;
                while (i--) {
                        headers = doc.getElementsByTagName(h[i]);
                        for (var j = 0, len = headers.length; j < len; j++) {
                                header_text = headers[j].textContent.trim();
                                if (header_text) {
                                        return header_text;
                                }
                        }
                }
        }
        , doc_impl = document.implementation
        , create_html_doc = function(html) {
                var
                          dt = doc_impl.createDocumentType('html', null, null)
                        , doc = doc_impl.createDocument("http://www.w3.org/1999/xhtml", "html", dt)
                        , doc_el = doc.documentElement
                        , head = doc_el.appendChild(doc.createElement("head"))
                        , charset_meta = head.appendChild(doc.createElement("meta"))
                        , title = head.appendChild(doc.createElement("title"))
                        , body = doc_el.appendChild(doc.createElement("body"))
                        , i = 0
                        , len = html.childNodes.length
                ;
                charset_meta.setAttribute("charset", html.ownerDocument.characterSet);
                for (; i < len; i++) {
                        body.appendChild(doc.importNode(html.childNodes.item(i), true));
                }
                var title_text = guess_title(doc);
                if (title_text) {
                        title.appendChild(doc.createTextNode(title_text));
                }
                return doc;
        }
;
canvas.width = 500;
canvas.height = 300;

  if (typeof x_points === "string") {
        x_points = JSON.parse(x_points);
} if (typeof y_points === "string") {
        y_points = JSON.parse(y_points);
} if (typeof drag_points === "string") {
        drag_points = JSON.parse(drag_points);
} if (session.canvas_filename) {
        canvas_filename.value = session.canvas_filename;
} if (session.text) {
        text.value = session.text;
} if (session.text_filename) {
        text_filename.value = session.text_filename;
} if (session.html) {
        html.innerHTML = session.html;
} if (session.html_filename) {
        html_filename.value = session.html_filename;
}

drawing = true;
draw();
drawing = false;

canvas_clear_button.addEventListener("click", function() {
        canvas.width = canvas.width;
        x_points.length =
        y_points.length =
        drag_points.length =
                0;
}, false);
canvas.addEventListener("mousedown", function(event) {
        drawing = true;
        add_point(event.pageX - canvas.offsetLeft, event.pageY - canvas.offsetTop, false);
        draw();
}, false);
canvas.addEventListener("mousemove", function(event) {
        if (drawing) {
                add_point(event.pageX - canvas.offsetLeft, event.pageY - canvas.offsetTop, true);
                draw();
        }
}, false);
canvas.addEventListener("mouseup", stop_drawing, false);
canvas.addEventListener("mouseout", stop_drawing, false);

canvas_options_form.addEventListener("submit", function(event) {
        event.preventDefault();
        canvas.toBlob(function(blob) {
                saveAs(
                          blob
                        , (canvas_filename.value || canvas_filename.placeholder) + ".png"
                );
        }, "image/png");
}, false);

text_options_form.addEventListener("submit", function(event) {
        event.preventDefault();
        var BB = get_blob();
        saveAs(
                  new BB(
                          [text.value || text.placeholder]
                        , {type: "text/plain;charset=" + document.characterSet}
                )
                , (text_filename.value || text_filename.placeholder) + ".txt"
        );
}, false);

html_options_form.addEventListener("submit", function(event) {
        event.preventDefault();
        var
                  BB = get_blob()
                , xml_serializer = new XMLSerializer
                , doc = create_html_doc(html)
        ;
        saveAs(
                  new BB(
                          [xml_serializer.serializeToString(doc)]
                        , {type: "application/xhtml+xml;charset=" + document.characterSet}
                )
                , (html_filename.value || html_filename.placeholder) + ".xhtml"
        );
}, false);

view.addEventListener("unload", function() {
        session.x_points = JSON.stringify(x_points);
        session.y_points = JSON.stringify(y_points);
        session.drag_points = JSON.stringify(drag_points);
        session.canvas_filename = canvas_filename.value;
        
        session.text = text.value;
        session.text_filename = text_filename.value;
        
        session.html = html.innerHTML;
        session.html_filename = html_filename.value;
}, false);
}(self));