1 | {{extend 'layout.html'}} |
---|
2 | |
---|
3 | {{block sectionclass}}shell{{end}} |
---|
4 | <!--style type="text/css"> |
---|
5 | |
---|
6 | .prompt, #output { |
---|
7 | width: 45em; |
---|
8 | border: 1px solid #CCCCCC; |
---|
9 | font-size: 10pt; |
---|
10 | margin: 0.5em; |
---|
11 | padding: 0.5em; |
---|
12 | padding-right: 0em; |
---|
13 | overflow: auto; |
---|
14 | wrap: hard; |
---|
15 | } |
---|
16 | |
---|
17 | #output { |
---|
18 | height:250px;overflow:auto; |
---|
19 | } |
---|
20 | |
---|
21 | #toolbar { |
---|
22 | margin-left: 0.5em; |
---|
23 | padding-left: 0.5em; |
---|
24 | } |
---|
25 | |
---|
26 | #caret { |
---|
27 | width: 2.5em; |
---|
28 | margin-right: 0px; |
---|
29 | padding-right: 0px; |
---|
30 | border-right: 0px; |
---|
31 | } |
---|
32 | |
---|
33 | #statement { |
---|
34 | width: 43em; |
---|
35 | margin-left: -1em; |
---|
36 | padding-left: 0px; |
---|
37 | border-left: 0px; |
---|
38 | background-position: top right; |
---|
39 | background-repeat: no-repeat; |
---|
40 | } |
---|
41 | |
---|
42 | .processing { |
---|
43 | background-image: url("{{=URL('static','images/spinner.gif')}}"); |
---|
44 | } |
---|
45 | |
---|
46 | #ajax-status { |
---|
47 | font-weight: bold; |
---|
48 | } |
---|
49 | |
---|
50 | .message { |
---|
51 | color: #8AD; |
---|
52 | font-weight: bold; |
---|
53 | font-style: italic; |
---|
54 | } |
---|
55 | |
---|
56 | .error { |
---|
57 | color: #F44; |
---|
58 | } |
---|
59 | |
---|
60 | .username { |
---|
61 | font-weight: bold; |
---|
62 | } |
---|
63 | |
---|
64 | </style--> |
---|
65 | <script src="{{=URL('static', 'js/autoscroll.js')}}"></script> |
---|
66 | |
---|
67 | <div id="wrapper"> |
---|
68 | <textarea id="output" readonly="readonly">{{=T('web2py Debugger')}} {{=request.env.web2py_version}}{{=data}}</textarea> |
---|
69 | |
---|
70 | <form id="form" action="{{=URL(r=request,f='callback',args=app)}}" method="get"> |
---|
71 | <div id="shellwrapper"> |
---|
72 | <div id="caret">>>></div> |
---|
73 | <div id="autoscroll" style="cursor:pointer;float:right;">autoscroll</div> |
---|
74 | <div class="tooltip"> |
---|
75 | <textarea class="prompt" name="statement" id="statement"></textarea> |
---|
76 | <span>{{=T('Type PDB debugger command in here and hit Return (Enter) to execute it.')}}</span> |
---|
77 | </div> |
---|
78 | </div> |
---|
79 | </form> |
---|
80 | </div> |
---|
81 | |
---|
82 | <div class="help"> |
---|
83 | <ul> |
---|
84 | <li>{{=T('Using the shell may lock the database to other users of this app.')}}</li> |
---|
85 | </ul> |
---|
86 | </div> |
---|
87 | |
---|
88 | <script type="text/javascript"> |
---|
89 | var bShellScrolling=0 |
---|
90 | jQuery(document).ready(function(){ |
---|
91 | jQuery('#statement').focus(); |
---|
92 | |
---|
93 | jQuery('#statement').keyup(function(event){ |
---|
94 | var t=jQuery(this), |
---|
95 | s=t.val(), |
---|
96 | o=jQuery('#output'), |
---|
97 | RETURN = 38; |
---|
98 | if(s=='\n') t.val(''); |
---|
99 | if(s.length>1 && s.substr(s.length-1,1)=='\n' && s.substr(s.length-2,1)!=':' && |
---|
100 | (s.indexOf(':\n ')<0 || s.substr(s.length-2,1)=='\n')) { |
---|
101 | t.val(''); |
---|
102 | jQuery.post("{{=URL(r=request,f='callback',args=app)}}", |
---|
103 | {statement:s},function(data){o.html(o.html()+data).attr('scrollTop',o.attr('scrollHeight'));}); |
---|
104 | } else { }; |
---|
105 | if(event.keyCode==RETURN){ |
---|
106 | var i=s.length |
---|
107 | if(i==0){ |
---|
108 | var s=o.find('table:last pre:first').text(); |
---|
109 | bShellScrolling=o.find('table').length; |
---|
110 | }else if(bShellScrolling){ |
---|
111 | var i=bShellScrolling |
---|
112 | if(i<1){ |
---|
113 | return |
---|
114 | }else{ |
---|
115 | i-- |
---|
116 | var s=o.find('table:nth-child('+(i)+') pre:first').text(); |
---|
117 | bShellScrolling=i |
---|
118 | } |
---|
119 | }else if(s.indexOf('\n')<0){ |
---|
120 | var oo=o.find('tr:first-child pre:contains("'+s+'")') |
---|
121 | if(oo.length==0){ |
---|
122 | return |
---|
123 | }else if(oo.length==1){ |
---|
124 | s=oo.text(); |
---|
125 | }else{ |
---|
126 | sVar=oo.text(); |
---|
127 | o.html(o.html()+'<dd>'+s+' ?</dd><dt>'+sVar+'</dt>').attr('scrollTop',o.attr('scrollHeight')) |
---|
128 | return |
---|
129 | } |
---|
130 | }else{ |
---|
131 | //multistring expr |
---|
132 | return; |
---|
133 | } |
---|
134 | // if(s.slice(s.length-1)=='\n'){ |
---|
135 | s=s.slice(0,s.length-1) |
---|
136 | // } |
---|
137 | t.val(s); |
---|
138 | } |
---|
139 | if(bShellScrolling && event.keyCode==40){ |
---|
140 | var i=bShellScrolling |
---|
141 | i++ |
---|
142 | var s=o.find('table:nth-child('+i+') tr:first-child pre').text(); |
---|
143 | if(s){ |
---|
144 | s=s.slice(0,s.length-1) |
---|
145 | t.val(s); |
---|
146 | bShellScrolling=i |
---|
147 | }else{ |
---|
148 | bShellScrolling=0 |
---|
149 | t.val('') |
---|
150 | } |
---|
151 | }; |
---|
152 | if(bShellScrolling && (event.keyCode==37 || event.keyCode==39)){ |
---|
153 | bShellScrolling=0; |
---|
154 | }; |
---|
155 | if(event.keyCode==27){ |
---|
156 | bShellScrolling=0; |
---|
157 | t.val(''); |
---|
158 | }; |
---|
159 | }); |
---|
160 | }); |
---|
161 | </script> |
---|
162 | |
---|