216 lines
7.5 KiB
Plaintext
216 lines
7.5 KiB
Plaintext
<html>
|
|
<head>
|
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
|
|
<title><%= @exception_name %></title>
|
|
<style type="text/css" media="screen">
|
|
body {
|
|
font-family:arial;
|
|
font-size:11px;
|
|
}
|
|
h1 {
|
|
font-size:48px;
|
|
letter-spacing:-4px;
|
|
margin:0;
|
|
line-height:36px;
|
|
color:#333;
|
|
}
|
|
h1 sup {
|
|
font-size: 0.5em;
|
|
}
|
|
h1 sup.error_500, h1 sup.error_400 {
|
|
color:#990E05;
|
|
}
|
|
h1 sup.error_100, h1 sup.error_200 {
|
|
color:#00BF10;
|
|
}
|
|
h1 sup.error_300 {
|
|
/* pretty sure you cant 'see' status 300
|
|
errors but if you could I think they
|
|
would be blue */
|
|
color:#1B2099;
|
|
}
|
|
h2 {
|
|
font-size:36px;
|
|
letter-spacing:-3px;
|
|
margin:0;
|
|
line-height:28px;
|
|
color:#444;
|
|
}
|
|
a, a:visited {
|
|
color:#00BF10;
|
|
}
|
|
.internalError {
|
|
width:800px;
|
|
margin:50px auto;
|
|
}
|
|
.header {
|
|
border-bottom:10px solid #333;
|
|
margin-bottom:1px;
|
|
background-image: url("data:image/gif;base64,R0lGODlhAwADAIAAAP///8zMzCH5BAAAAAAALAAAAAADAAMAAAIEBHIJBQA7");
|
|
padding:20px;
|
|
}
|
|
table.trace {
|
|
width:100%;
|
|
font-family:courier, monospace;
|
|
letter-spacing:-1px;
|
|
border-collapse: collapse;
|
|
border-spacing:0;
|
|
}
|
|
table.trace tr td{
|
|
padding:0;
|
|
height:26px;
|
|
font-size:13px;
|
|
vertical-align:middle;
|
|
}
|
|
table.trace tr.file{
|
|
border-top:2px solid #fff;
|
|
background-color:#F3F3F3;
|
|
}
|
|
table.trace tr.source {
|
|
background-color:#F8F8F8;
|
|
display:none;
|
|
}
|
|
table.trace .open tr.source {
|
|
display:table-row;
|
|
}
|
|
table.trace tr.file td.expand {
|
|
width:23px;
|
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAIAAABvSEP3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdVJREFUeNqMVL+TwUAYxaRIOlEhlZHGDAUzzOQ61+AqXMV1lJSU7q/QRqm8KFUcJTNn5qJkaPyoKKVz7y4mF8na5Kt29tt9+/Z97/u81+vVQ4r9frdarS6Xi7ETDIZisRjxMGPfmk4niNPpZE+xLAugbPaZ53nzvtfMBe/3+/3dbuehBrAKhZdUKkVAWa9Xsiybv0CPZDJZLr/qa5/BwgwRjYqOKIvFYjQa/aNommZh0Ww2K5UqzwfoQOPxaLPZ3FAmk0+7lplMpt1u53J5OpBOR0eZEE9wHJfP5zud93g88QhluwWbjW+5VOmKBgKBer3eaDTDYeGBQF8+x7rqIYoiPgixWJazpA6HA+MSxRArkUgMh0M409g8Ho8+9wYxxCqVSq1W26EDHGM2m4HOHQrEc38f/Yn7cLmlIRhBENzcx8cVRZnPZ/YUep2BWkjTIfA+PKVpZAXR5QxsjiqCKvGEqqp443w+0dvy17swqD0HB3S73V5PpkNg1qBqt8kwGCjmPkinM0QJbIoEa7U6UG6ToVgs4V9G2g0ESoP5Aoi7KYX5oCgf8IKbkvn9/mr1LRQKESamzgJy0g0tSZIuB3nuGqRU9Vv9C4sKkUhEkp4soxvxI8AAhWrrtXa3X8EAAAAASUVORK5CYII=);
|
|
background-position:top left;
|
|
background-repeat:no-repeat;
|
|
}
|
|
table.trace .open tr.file td.expand {
|
|
width:19px;
|
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAB1CAIAAAAqdO2mAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXZJREFUeNrslK1ywkAUhcMOBomEOiSdqLxEBJX0NaijOsjyHGGmCGyQQYaiiiw4gktkcOmZbpsuuzQ/M5XnqJ2d3S/n3nM3rTzPLUP7/Tt0+pLcGQwG3W53OLyHzPMtjYL7q9UqSRLrD4E1Gj1orCvKYuFHUWTVkOM44/HjDcp8/lL4r6NerzeZPMm1KFw0QkDn83m5fP2lHA4fNQvRtNvtjsfDd0WzmSfb2e/fdTqdOvdh/HLJZLOn0+d2HJ+KRGzbdl23EpFlmed5cp2maRzHQq1lvQ5KMi6EUZBGfup6E1pTfd+vrGW7jbQ2C9hTt9BpqNyIWaAwAy6xg2eBz5iRC/NomiZhGN5sqmnkauo0BUGgVQoBjQ80oCACgNQdZHfTYBkF2mxCtWWAqunWpahxIDUt3QYUxIFQpJHyIWpXjinabKbbwItMHT+NyjchrP8QKaSQQgoppJBCCimkkEIKKaSQQgoppJBCCimkkEIKKaSo+hRgAEFD17X08O2NAAAAAElFTkSuQmCC);
|
|
background-position:top left;
|
|
background-repeat:no-repeat;
|
|
}
|
|
table.trace tr.source td.collapse {
|
|
width:19px;
|
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAB1CAIAAAAqdO2mAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAVxJREFUeNrs0zFygkAUBmBlUkgJHdABlQwVkVJKKUxBYWbkALTxMJwhltyDFkss03IF8pudIcwaDaDl/6pd2P327b7d+eHwMXs4lNkzggoVKlSoUKFChQoVKlSoUKFChQoVKlSoUKFChQqVEYqm6ft9+qiSJEkYho7jTlcw2fd9NOI4nq4gEdFwXXe1Cqco63VkWVbXRTqLhTpOwQRpF7quR1E0TgGhqvLKUFCyoQqG/rks3O6kZKW/eRFpevOCoGTXVTcMQ5EyxyDEkML1c5RzuZOICIyXqn7JBVez6282MWrx731HOv2qB8Hri2lamNk0DfpVVdV1Peodappmmua8bdvzuc7zfNprzrLMth1FnGh/X8MjCAIQv/cFz/+65PcDh7rbvYv2ZUfdj+PxsyzLgVl0hKwgTqeqKApx2LeOc7t98zyv/1FWOgvx9RPii23bmL9cetJ8Ed8CDAC6aFW8bCzFhwAAAABJRU5ErkJggg==);
|
|
background-position:bottom left;
|
|
background-repeat:no-repeat;
|
|
background-color:#6F706F;
|
|
}
|
|
table.trace tr td.path {
|
|
padding-left:10px;
|
|
}
|
|
table.trace tr td.code {
|
|
padding-left:35px;
|
|
white-space: pre;
|
|
line-height:9px;
|
|
padding-bottom:10px;
|
|
}
|
|
table.trace tr td.code em {
|
|
font-weight:bold;
|
|
color:#00BF10;
|
|
}
|
|
table.trace tr td.code a {
|
|
width: 20px;
|
|
float: left;
|
|
}
|
|
table.trace tr td.code .more {
|
|
color:#666;
|
|
}
|
|
table.trace tr td.line {
|
|
width:30px;
|
|
text-align:right;
|
|
padding-right:4px;
|
|
}
|
|
.footer {
|
|
margin-top:5px;
|
|
font-size:11px;
|
|
color:#444;
|
|
text-align:right;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="internalError">
|
|
|
|
<div class="header">
|
|
<h1><%= @exception_name %> <sup class="error_<%= @exception.class::STATUS %>"><%= @exception.class::STATUS %></sup></h1>
|
|
<% if show_details = ::Merb::Config[:exception_details] -%>
|
|
<h2><%=h @exception.message %></h2>
|
|
<% else -%>
|
|
<h2>Sorry about that...</h2>
|
|
<% end -%>
|
|
<h3>Parameters</h3>
|
|
<ul>
|
|
<% params[:original_params].each do |param, value| %>
|
|
<li><strong><%= param %>:</strong> <%= value.inspect %></li>
|
|
<% end %>
|
|
<%= "<li>None</li>" if params[:original_params].empty? %>
|
|
</ul>
|
|
|
|
<h3>Session</h3>
|
|
<ul>
|
|
<% params[:original_session].each do |param, value| %>
|
|
<li><strong><%= param %>:</strong> <%= value.inspect %></li>
|
|
<% end %>
|
|
<%= "<li>None</li>" if params[:original_session].empty? %>
|
|
</ul>
|
|
|
|
<h3>Cookies</h3>
|
|
<ul>
|
|
<% params[:original_cookies].each do |param, value| %>
|
|
<li><strong><%= param %>:</strong> <%= value.inspect %></li>
|
|
<% end %>
|
|
<%= "<li>None</li>" if params[:original_cookies].empty? %>
|
|
</ul>
|
|
</div>
|
|
|
|
<% if show_details %>
|
|
<table class="trace">
|
|
<% @exception.backtrace.each_with_index do |line, index| %>
|
|
<tbody class="close">
|
|
<tr class="file">
|
|
<td class="expand">
|
|
</td>
|
|
<td class="path">
|
|
<%= (line.match(/^([^:]+)/)[1] rescue 'unknown').sub(/\/((opt|usr)\/local\/lib\/(ruby\/)?(gems\/)?(1.8\/)?(gems\/)?|.+\/app\/)/, '') %>
|
|
<% unless line.match(/\.erb:/) %>
|
|
in "<strong><%= line.match(/:in `(.+)'$/)[1] rescue '?' %></strong>"
|
|
<% else %>
|
|
(<strong>ERB Template</strong>)
|
|
<% end %>
|
|
</td>
|
|
<td class="line">
|
|
<a href="txmt://open?url=file://<%=file = (line.match(/^([^:]+)/)[1] rescue 'unknown')%>&line=<%= lineno = line.match(/:([0-9]+):/)[1] rescue '?' %>"><%=lineno%></a>
|
|
</td>
|
|
</tr>
|
|
<tr class="source">
|
|
<td class="collapse">
|
|
</td>
|
|
<td class="code" colspan="2"><% (__caller_lines__(file, lineno, 5) rescue []).each do |llineno, lcode, lcurrent| %>
|
|
<a href="txmt://open?url=file://<%=file%>&line=<%=llineno%>"><%= llineno %></a><%='<em>' if llineno==lineno.to_i %><%= lcode.size > 90 ? CGI.escapeHTML(lcode[0..90])+'<span class="more">......</span>' : CGI.escapeHTML(lcode) %><%='</em>' if llineno==lineno.to_i %>
|
|
<% end %>
|
|
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
<% end %>
|
|
</table>
|
|
<script type="text/javascript" charset="utf-8">
|
|
// swop the open & closed classes
|
|
els = document.getElementsByTagName('td');
|
|
for(i=0; i<els.length; i++){
|
|
if(els[i].className=='expand' || els[i].className=='collapse'){
|
|
els[i].onclick = function(e){
|
|
tbody = this.parentNode.parentNode;
|
|
if(tbody.className=='open'){
|
|
tbody.className='closed';
|
|
}else{
|
|
tbody.className='open';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
<% end %>
|
|
<div class="footer">
|
|
lots of love, from <a href="#">merb</a>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html> |