source: gs3-extensions/html-to-expeditee/trunk/src/src/cgi-bin/html-to-expeditee.pl.in@ 24934

Last change on this file since 24934 was 24934, checked in by davidb, 12 years ago

Introduction of new Perl module to handle taking the JSON version of the traversed HTML tree and output it as an expeditee frame

File size: 9.0 KB
Line 
1#!@FULL_PERL_EXE@ -w
2
3# Need to specify the full path of Perl above, e.g. for Windows something like
4#!C:\\Perl32\\bin\\perl -w
5
6
7use strict;
8
9# Set this to 1 to work around IIS 6 craziness
10my $iis6_mode = 0;
11
12
13# IIS 6: for some reason, IIS runs this script with the working directory set to the Greenstone
14# directory rather than the cgi-bin directory, causing lots of stuff to fail
15if ($iis6_mode)
16{
17 # Change into cgi-bin directory
18 chdir("cgi-bin");
19}
20
21
22# We use require and an eval here (instead of "use") to catch any errors loading the module (for IIS)
23eval("require \"gsdlCGI.pm\"");
24if ($@)
25{
26 print STDOUT "Content-type:text/plain\n\n";
27 print STDOUT "ERROR: $@\n";
28 exit 0;
29}
30
31
32sub generate_html_form
33{
34 my ($isGSDL2,$site,$collect,$cl) = @_;
35
36 my $html_form = <<EOT;
37<html>
38 <head>
39 <title>HTML to Expeditee Frames</title>
40
41 <base href=".." />
42
43 <link type="text/css" href="ext/html-to-expeditee/jquery/css/le-frog/jquery-ui-1.8.16.custom.css" rel="stylesheet" />
44 <script type="text/javascript" src="ext/html-to-expeditee/jquery/js/jquery-1.6.2.min.js"></script>
45 <script type="text/javascript" src="ext/html-to-expeditee/jquery/js/jquery-ui-1.8.16.custom.min.js"></script>
46 <script type="text/javascript" src="ext/html-to-expeditee/js/gsajax-min.js"></script>
47 <script type="text/javascript" src="ext/html-to-expeditee/js/html-to-expeditee.js"></script>
48
49
50
51 </head>
52 <body>
53 <form class="ui-widget">
54 Convert the collection
55 <input type="text"
56 class="ui-corner-all" style="padding: 4px;"
57 name="collect" value="$collect" id="collect" />
58 to Expeditee frames by traversing the classifier
59 <input type="text"
60 class="ui-corner-all" style="padding: 4px;"
61 name="cl" value="$cl" id="cl" />
62
63 <input value="$site" id="site" type="hidden">
64 <input value="Go" id="go"
65 class="ui-button ui-widget ui-state-default ui-corner-all"
66 type="submit">
67
68 </form>
69 <script type="text/javascript">
70 var docOIDs = [];
71 var numDocOIDs;
72
73 \$(function() {
74 \$('#progress').progressbar();
75
76 \$('#go').button().click(function() {
77 var collect = document.getElementById("collect").value;
78 if (collect.match(/^\\s*\$/)) {
79 alert("No collection specified");
80 return false;
81 }
82
83 var cl = document.getElementById("cl").value;
84 if (cl.match(/^\\s*\$/)) {
85 alert("No classifier specified");
86 return false;
87 }
88 if (cl.match(/^\\d+\$/)) {
89 cl = "CL" + cl;
90 }
91
92 var gs2=$isGSDL2;
93
94 var url;
95 if (gs2) {
96 url = "library.cgi";
97 url += "?c="+collect +"&a=d&cl=" + cl;
98 }
99 else {
100 url = "dev";
101 url += "?c="+collect +"&a=b&rt=s&s=ClassifierBrowse&cl=" + cl;
102 url += "&excerptid=gs_content";
103 }
104
105
106 /* processing animation */
107
108 docOIDs = [];
109 var outstandingURLs = [];
110 outstandingURLs.push(url);
111
112 while (outstandingURLs.length>0) {
113 url = outstandingURLs.shift();
114
115 var clHtml = urlGetSync(url);
116
117 var aElems;
118 var workingTrav = document.getElementById("workingTraverse");
119 workingTrav.innerHTML = clHtml;
120 aElems = workingTrav.getElementsByTagName("a");
121
122
123 /* any links with a=d ... cl=??? => outstandingURLS */
124 /* any links with a=d ... d=??? => docOIDS */
125
126 var actionRE = new RegExp("(\\\\?|&)a=(?:d|b)(&|\$)");
127 var clRE = new RegExp("(\\\\?|&)cl=" + cl + "\\\\.");
128 var docRE = new RegExp("(?:\\\\?|&)d=(.*?)(?:&|\$)");
129
130 for (var i=0; i<aElems.length; i++) {
131 var aElem = aElems[i];
132 var href=aElem.href;
133 if (href && href.match(actionRE)) {
134 if (href.match(clRE)) {
135 outstandingURLs.push(href);
136 }
137 else if (href.match(docRE)) {
138
139 var docMatch = docRE.exec(href);
140 var docOID = docMatch[1];
141
142 docOIDs.push(docOID);
143 }
144 }
145 }
146 }
147
148 numDocOIDs = docOIDs.length;
149
150 var iframe = document.getElementById("iframe");
151
152 var docOID = docOIDs.shift();
153 console.log("doc oid = " + docOID);
154
155 var url;
156 if (gs2) {
157 url = "library.cgi";
158 url += "?c="+collect +"&a=d&d=" + docOID;
159 }
160 else {
161 url = "dev";
162 url += "?c="+collect +"&a=d&d=" + docOID;
163 url += "&ed=1&dt=hierarchy";
164 // url += "&excerptid=gs_content";
165 }
166
167 /* load iframe with document drawn from Greenstone collection */
168 iframe.src = url;
169
170 var progressbar = document.getElementById("progressbar");
171 progressbar.style.display = "block";
172
173
174 return false; });
175 });
176
177 function pageLoaded()
178 {
179 var iframe = document.getElementById("iframe");
180
181 if (iframe.src) {
182 if (iframe.style.display != "block") {
183 iframe.height = "90%";
184 iframe.style.display = "block";
185 }
186
187 var iframeDoc;
188 if ( iframe.contentDocument )
189 { /* FF */
190 iframeDoc = iframe.contentDocument;
191 }
192 else if ( iframe.contentWindow )
193 { /* IE */
194 iframeDoc = iframe.contentWindow.document;
195 }
196
197 var frameID = (numDocOIDs - docOIDs.length);
198 var progressPercent = frameID/numDocOIDs * 100;
199
200 \$(function() {
201 \$('#progressbar').progressbar({ value: progressPercent })
202 });
203
204 var gsContent = iframeDoc.getElementById("gs_content");
205
206 /*
207 var gsContentPos = getElementPosition(gsContent);
208 var pxl = gsContentPos.xl;
209 var pxr = gsContentPos.xr;
210 */
211
212 var expFrameTree = htmlToExpeditee(gsContent);
213
214 var expFrame = JSON.stringify(expFrameTree);
215 //alert(expFrame);
216
217 var collect = document.getElementById("collect").value;
218 var site = document.getElementById("site").value;
219
220 var url = "cgi-bin/html-to-expeditee.pl";
221 var params = "c=" + collect;
222 if (site.match(/\\w/)) {
223 params += "&site=" + site;
224 }
225 params += "&a=generate-frame&fn=" + frameID;
226 params += "&json=" + escape(expFrame);
227
228 var clHtml = urlPostSync(url,params);
229
230 if (!clHtml.match(/html-to-expeditee saved frame/)) {
231 alert("Error processing url: " + url);
232 }
233
234 if (docOIDs.length>0) {
235 var docOID = docOIDs.shift();
236
237 // console.log("doc oid = " + docOID);
238
239 // is the following line used ????
240 var cl = document.getElementById("cl").value;
241
242 var gs2 = $isGSDL2;
243 var url;
244
245 if (gs2) {
246 url = "library.cgi";
247 url += "?c="+collect +"&a=d&d=" + docOID;
248 }
249 else {
250 url = "dev";
251 url += "?c="+collect +"&a=d&d=" + docOID;
252 url += "&ed=1&dt=hierarchy";
253 // url += "&excerptid=gs_content";
254 }
255
256 iframe.src = url;
257 }
258 else {
259 var progressbar = document.getElementById("progressbar");
260 progressbar.style.display = "none";
261
262 iframe.style.display = "none";
263 delete iframe.src;
264 }
265 }
266
267 }
268
269 </script>
270
271 <div id="progressbar" width="100%"
272 style="display: none; margin: 10px; height: 10px;"></div>
273 <div id="workingTraverse" style="display: none"></div>
274
275 <hr style="margin: 10px;">
276
277 <iframe width="100%" id="iframe" style="display: none;"
278 onload="pageLoaded()"></iframe>
279
280 </body>
281</html>
282EOT
283
284 print "Content-type:text/html\n\n";
285 print $html_form;
286}
287
288sub main
289{
290
291# $ENV{'QUERY_STRING'} = "a=...";set-import-metadata&c=espresso-music&d=HASH012d6f72cde5dc48162f4a1d.1&metaname=annotation&metapos=0&metavalue=adfadfad";
292# $ENV{'REQUEST_METHOD'} = "GET";
293
294 my $gsdl_cgi = new gsdlCGI();
295
296 # Load the Greenstone modules that we need to use
297 $gsdl_cgi->setup_gsdl();
298
299 my $gsdlhome = $ENV{'GSDLHOME'};
300 $gsdl_cgi->checked_chdir($gsdlhome);
301
302 require cgiactions::HtmlToExpediteeAction;
303
304 # Useful debug statement for seeing what packages have been included
305#### printf("%-45s%-s\n",$_,$INC{$_}) foreach (sort keys %INC);
306
307 $gsdl_cgi->parse_cgi_args();
308
309 # We don't want the gsdlCGI module to return errors and warnings in XML
310 $gsdl_cgi->{'xml'} = 0;
311
312 my $fn = $gsdl_cgi->clean_param("fn"); # frame number
313
314 if (defined $fn) {
315
316 my $action = new HtmlToExpediteeAction($gsdl_cgi,$iis6_mode);
317
318 $action->do_action();
319
320 }
321 else {
322 # generate form, pre-filled out with any useful values such
323 # as the collection and classifier value
324
325 my $collect = $gsdl_cgi->clean_param("c");
326 my $cl = $gsdl_cgi->clean_param("cl");
327
328 # Establish collect_dir using defining 'site' along the way if GS3
329
330 my $site = undef;
331 my $isGSDL2 = undef;
332
333 if ($gsdl_cgi->greenstone_version() == 2) {
334 $isGSDL2 = 1;
335 }
336 else {
337 $isGSDL2 = 0;
338
339 # GS3 (and possible future versions) make use of 'site'
340 $site = $gsdl_cgi->clean_param("site");
341 if (!defined $site) {
342 $gsdl_cgi->generate_error("No site specified.");
343 }
344 }
345
346 generate_html_form($isGSDL2,$site,$collect,$cl);
347 }
348}
349
350
351
352&main();
Note: See TracBrowser for help on using the repository browser.