20yco
20yco

Reputation: 906

decompile _underscore template

i've got many "compiled" underscore template ( some months ago i save compiled templates to on file, and accidentally remove original templates folder... :( ) is it pissible to "decompile" this templates? one of example:

UV.templates["template-button-widget"] = function() {
        return $.trim(function(obj) {
            var __t, __p = "",
                __j = Array.prototype.join,
                print = function() {
                    __p += __j.call(arguments, "")
                };
            with(obj || {}) __p += '\n\n    <div class="button" data-id="' + (null == (__t = data._id) ? "" : _.escape(__t)) + '">\n\n        <div class="icon"></div>\n\n    </div>\n\n';
            return __p
        }.apply(this, arguments))
}, 

Upvotes: 0

Views: 67

Answers (2)

mikeapr4
mikeapr4

Reputation: 2856

If you read over the source of _.template, you'll find it's simple enough that you could reverse it with a few hours of work. Make sure to find the code for your version of underscore (clearly yours isn't the most recent as there are changes), old docs can be found in the changelog.

Here's the code required to reverse your example template:

var compiled = function() {
        return $.trim(function(obj) {
            var __t, __p = "",
                __j = Array.prototype.join,
                print = function() {
                    __p += __j.call(arguments, "")
                };
            with(obj || {}) __p += '\n\n    <div class="button" data-id="' + (null == (__t = data._id) ? "" : _.escape(__t)) + '">\n\n        <div class="icon"></div>\n\n    </div>\n\n';
            return __p
        }.apply(this, arguments))
};

var source = compiled.toString();

// Strip start/end code
source = source.substring(source.indexOf("with(obj || {}) __p += '\\n\\n") + 28);
source = source.substring(0, source.indexOf("\\n\\n';"));

// Reverse escape
source = source.replace(/' \+ \(null == \(__t = ([^)]+)\) \? "" : _.escape\(__t\)\) \+ '/g, "<%- $1 %>");

$('#result').text(source.replace(/\\n/g, "\n"));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>
<pre id="result"/>

Upvotes: 1

Leo Bufi Barrameda
Leo Bufi Barrameda

Reputation: 359

You can manually decompile it.. base on your code your template definition will be:

`<div class="button" data-id="<%= data._id %>'">
    <div class="icon"></div>
</div>`

It is easy but for complex template it will be harder.

Upvotes: 0

Related Questions