unzip

unzip an archive and displays text files in utf-8.

HTML

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
        body { font-size: 8pt; font-family: Sans-Serif; }
        table { border-collapse: collapse; width: 100%; }
        table td { border: 1px solid #000; }
    </style>
</head>
<body>
    <div id="content"></div>
    <table id="result"></table>
    <textarea id="displayArea" cols="80" rows="25" readonly="readonly"></textarea>
    <script type="text/javascript">

        var content = document.getElementById("content");

        if (!window.FileReader)
        {
            alert("Not supported!");
        }
        else
        {
            content.innerHTML = '<input type="file" id="file" />';
                var displayArea = document.getElementById("displayArea");

            function displayText(entry) {
                return function () {
                    displayArea.value = entry.openText();
                };
            }

            function displayEntries(event) {

                var table = document.getElementById("result");

                table.innerHTML = "";

                for (var i = 0; i < event.result.length; i++)
                {
                    var entry = event.result[i];
                    var tr = document.createElement("tr");
                    var nameCell = document.createElement("td");
                    var sizeCell = document.createElement("td");
                    var compressedCell = document.createElement("td");
                    var dateCell = document.createElement("td");
                    var methodCell = document.createElement("td");
                    var displayCell = document.createElement("td");
                    var displayLink = document.createElement("a");
										var li = document.createElement("li");
                    var a = document.createElement("a");
                    
                    a.textContent = entry.filename;
                    a.href = "#"
                   ...

JavaScript

Unzip = function (buffer) {
    this._buffer = buffer;
    this._stream = new ZipStream(buffer);

    var context = this;

    // TODO: Utiliser les web workers
    setTimeout(function () {
        context._readEntries(context._stream);

        if (typeof context.onload === "function")
        {
            context.onload({ target: context, result: context._entries });
        }
    }, 0);
}

Unzip.END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06054b50;
Unzip.END_OF_CENTRAL_RECORD_BASESIZE = 22;
Unzip.CENTRAL_HEADER_SIGNATURE = 0x02014b50;
Unzip.LOCAL_HEADER_SIGNATURE = 0x04034b50

Unzip.prototype = {
    _readEntries: function (stream) {
        /// <summary>Search for and read the central directory of a zip file filling the entries array.</summary>
        /// <param name="stream" type="ZipStream">The stream</param>
        // Search for the end of central directory
        var locatedEndOfCentralDir = this._locateBlockWithSignature(
            Unzip.END_OF_CENTRAL_DIRECTORY_SIGNATURE, this._buffer.byteLength, Unzip.END_OF_CENTRAL_RECORD_BASESIZE, 0xffff);

        if (locatedEndOfCentralDir < 0)
        {
            throw new Error("Cannot find central directory");
        }

        // Read end of central directory record
        stream.seek(locatedEndOfCentralDir, ZipStream.ORIGIN_BEGIN);

        var thisDiskNumber = stream.readLEUShort();
        var startCentralDirDisk = stream.readLEUShort();
        var entriesForThisDisk = stream.readLEUShort();
        var entriesForWholeCentralDir = stream.readLEUShort();
        var centralDirSize = stream.readLEUInt();
        var offsetOfCentralDir = stream.readLEUInt();
        var commentSize = stream.readLEUShort();

        if (commentSize > 0)
        {
            this._comment = stream.readString(commentSize);
        }

        // Check zip64 header
        if (thisDiskNumber === 0xffff
            || startCentralDirDisk === 0xffff
            || entriesForThisDisk === 0xffff
            ||...