root/gs3-extensions/html-to-expeditee/trunk/src/src/cgi-bin/html-to-expeditee.pl.in @ 26694

Revision 26694, 11.7 KB (checked in by davidb, 7 years ago)

These scripts will now search the processed GSDL document's xml for frame number and assocfilepath values.

Line 
1 #!/cygdrive/c/strawberry/perl/bin/perl -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" name="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 = "library";
101              url += "?c="+collect +"&a=b&rt=s&s=ClassifierBrowse&cl=" + cl;
102              url += "&excerptid=gs_content";
103          }
104
105          /* processing animation */
106         
107          docOIDs = [];
108          var outstandingURLs = [];
109          var visitedURLs = {};
110
111          outstandingURLs.push(url);
112          visitedURLs[url] = 1;
113
114          while (outstandingURLs.length>0) {
115          url = outstandingURLs.shift();
116         
117          var clHtml = urlGetSync(url);
118                 
119          var aElems;
120          var workingTrav = document.getElementById("workingTraverse");
121          workingTrav.innerHTML = clHtml;
122          aElems = workingTrav.getElementsByTagName("a");
123         
124         
125          /* any links with a=(b|d) ... cl=??? => outstandingURLS */
126          /* any links with a=d ... d=???  => docOIDS */
127
128/*       
129          var actionRE = new RegExp("(\\\\?|&)a=(?:d|b)(&|\$)");
130          var clRE     = new RegExp("(\\\\?|&)cl=" + cl + "(\\\\.\\\\d+)+(&|\$)");
131          var docRE    = new RegExp("(?:\\\\?|&)d=(.*?)(?:&|\$)");
132*/
133          var actionRE = new RegExp("(\\\\/)(?:document|browse)(\\\\/)");
134          var clRE     = new RegExp("(\\\\/)browse\\\\/" + cl + "(\\\\/\\\\d+)+(\$)");
135          var docRE    = new RegExp("(?:\\\\/)document\\\\/(.*?)(?:\$)");
136         
137          for (var i=0; i<aElems.length; i++) {
138              var aElem = aElems[i];
139              var href=aElem.href;
140              if (href && href.match(actionRE)) {
141              if (href.match(clRE)) {
142                  if (!visitedURLs[href]) {     
143                      // console.log("found a new CL line: " + href);
144                      outstandingURLs.push(href);
145                  visitedURLs[href] = 1;
146                  }
147              }
148              else if (href.match(docRE)) {
149                if(!visitedURLs[href]){
150                  var docMatch = docRE.exec(href);
151                  var docOID = docMatch[1];
152
153                  // console.log("found a new doc line: " + docOID);
154                  visitedURLs[href] = 1;
155                  docOIDs.push(docOID);
156              }
157              }
158              }
159          }
160          }
161
162          numDocOIDs = docOIDs.length;
163
164          var iframe = document.getElementById("iframe");
165
166          var docOID = docOIDs.shift();
167          //console.log("doc oid = " + docOID);
168         
169          var url;
170          if (gs2) {
171              url = "library.cgi";
172              url += "?c="+collect +"&a=d&d=" + docOID;
173          }
174          else {
175              url = "library";
176              url += "?c="+collect +"&a=d&d=" + docOID;
177             
178              /** The line below has been commented out. This is because the incorrect page is being loaded up in the iframe (i.e. just the document image and heading is being displayed but not any html customizations made in the collectionConfig.xml file**/
179              //url += "&ed=1&dt=hierarchy";
180              // url += "&excerptid=gs_content";
181          }
182         
183          //url += "&p.showExpediteeAttributes=1";
184          url += "&p.showAssocFilePath=1";
185
186         
187          /* load iframe with document drawn from Greenstone collection */
188          iframe.src = url;
189         
190          var progressbar = document.getElementById("progressbar");
191          progressbar.style.display = "block";
192
193
194          return false; });
195     });
196     
197      function pageLoaded()
198      {
199      var iframe = document.getElementById("iframe");     
200     
201      if (iframe.src) {
202          if (iframe.style.display != "block") {
203          iframe.height = "90%";
204          iframe.style.display = "block";
205          }
206
207          var iframeDoc;
208          if ( iframe.contentDocument )
209          { /* FF */
210            iframeDoc = iframe.contentDocument;
211          }
212          else if ( iframe.contentWindow )
213          { /* IE */
214            iframeDoc = iframe.contentWindow.document;
215          }
216         
217          var xmlUrl = iframe.src + "&o=xml";
218         
219          var iter = (numDocOIDs - docOIDs.length);
220          var progressPercent = iter/numDocOIDs * 100;
221         
222          /*Check if a frame-id metadata element already exists,
223          otherwise generate a new frame number based on the
224          number of documents to process.*/
225          var frameNum = getMetadata(xmlUrl,'frameID');
226         
227          if(frameNum === null){
228            frameNum = iter;
229            console.log("no frameNum found, use iter: " + frameNum);
230          }else{
231            console.log("frameNum metadata found: " + frameNum);
232          }
233         
234          \$(function() {
235          \$('#progressbar').progressbar({ value: progressPercent })
236         });
237
238          var gsContent = iframeDoc.getElementById("gs_content");
239
240          /*
241          var gsContentPos = getElementPosition(gsContent);
242          var pxl = gsContentPos.xl;
243          var pxr = gsContentPos.xr;
244          */
245         
246          //Check if an assocfilepath annotation already exists on the page, otherwise obtain it from the xml.
247          var assocElem = iframeDoc.getElementById('assocfilepath');
248          var assoc = null;
249         
250          if(assocElem === undefined || assocElem === null){
251            assoc = getMetadata(xmlUrl,'assocfilepath');
252          }
253
254          var expFrameTree = htmlToExpeditee(gsContent);
255
256          var expFrame = JSON.stringify(expFrameTree);
257          //alert(expFrame);
258
259          var collect = document.getElementById("collect").value;
260          var site    = document.getElementById("site").value;
261
262          var url = "cgi-bin/html-to-expeditee.pl";
263          var params = "c=" + collect;
264          if (site.match(/\\w/)) {
265            params += "&site=" + site;
266          }
267         
268          //params += "&a=generate-frame&fn=" + iter;
269          params += "&a=generate-frame&fn=" + frameNum;
270          params += "&json=" + escape(expFrame);
271         
272          //add an assocfilepath parameter but only if it is defined.
273          if(assoc !== null){
274            params += "&assoc=" + assoc;
275          }
276
277          var clHtml = urlPostSync(url,params);
278
279          if (!clHtml.match(/html-to-expeditee saved frame/)) {
280            alert("Error processing url: " + url);
281          }
282
283          if (docOIDs.length>0) {
284          var docOID = docOIDs.shift();
285         
286          // console.log("doc oid = " + docOID);
287
288         // is the following line used ????
289          var cl = document.getElementById("cl").value;
290         
291          var gs2 = $isGSDL2;
292              var url;
293
294              if (gs2) {
295                  url = "library.cgi";
296                  url += "?c="+collect +"&a=d&d=" + docOID;
297              }
298              else {
299                  url = "library";
300                  url += "?c="+collect +"&a=d&d=" + docOID;
301                 
302                  /** Refer to comment earlier in this code in regards to the commented out line below.**/
303                  //url += "&ed=1&dt=hierarchy";
304                  // url += "&excerptid=gs_content";
305              }
306
307          //url += "&p.showExpediteeAttributes=1";
308            url += "&p.showAssocFilePath=1";
309         
310            iframe.src = url;
311          }
312          else {
313            var progressbar = document.getElementById("progressbar");
314            progressbar.style.display = "none";
315
316            iframe.style.display = "none";
317            delete iframe.src;
318          }
319      }
320     
321      }
322     
323    /**
324    * Once this is working, remove getAssocFilePath method
325    * This method is used at this stage to retrieve assocfilepath
326    * and frame number metadata values from the document's xml.
327    **/
328    function getMetadata(xmlUrl,nameValue){
329     
330        var metadata = null;
331       
332         \$.ajax({
333            type: "GET",
334            async: false,
335            url: xmlUrl,
336            dataType: "xml",
337            success: function(xml){
338               
339                               
340                \$(xml).find('metadata').each(function(){
341                   
342                    var name = \$(this).attr('name');
343                   
344                    if(name === nameValue){
345                        if(metadata === null){
346                            metadata = \$(this).text();
347                            //console.log(metadata);
348                        }
349                       
350                    }   
351                });
352               
353            }
354           
355          });
356       
357        return metadata;
358      }
359
360    </script>
361
362    <div id="progressbar" width="100%"
363          style="display: none; margin: 10px; height: 10px;"></div>
364    <div id="workingTraverse" style="display: none"></div>
365
366    <hr style="margin: 10px;">
367
368    <iframe width="100%" id="iframe" style="display: none;"
369            onload="pageLoaded()"></iframe>
370
371  </body>
372</html>
373EOT
374
375    print "Content-type:text/html\n\n";
376    print $html_form;
377}
378
379sub main
380{
381
382#    $ENV{'QUERY_STRING'} = "a=...";set-import-metadata&c=espresso-music&d=HASH012d6f72cde5dc48162f4a1d.1&metaname=annotation&metapos=0&metavalue=adfadfad";
383#    $ENV{'REQUEST_METHOD'} = "GET";
384
385    my $gsdl_cgi = new gsdlCGI();
386
387    # Load the Greenstone modules that we need to use
388    $gsdl_cgi->setup_gsdl();
389
390    my $gsdlhome = $ENV{'GSDLHOME'};   
391    $gsdl_cgi->checked_chdir($gsdlhome);
392
393    require cgiactions::HtmlToExpediteeAction;
394   
395    # Useful debug statement for seeing what packages have been included
396####    printf("%-45s%-s\n",$_,$INC{$_}) foreach (sort keys %INC);
397   
398    $gsdl_cgi->parse_cgi_args();
399
400    # We don't want the gsdlCGI module to return errors and warnings in XML
401    $gsdl_cgi->{'xml'} = 0;
402
403    my $fn = $gsdl_cgi->clean_param("fn");     # frame number
404
405    if (defined $fn) {
406
407    my $action = new HtmlToExpediteeAction($gsdl_cgi,$iis6_mode);
408
409    $action->do_action();
410    }
411    else {
412    # generate form, pre-filled out with any useful values such
413    # as the collection and classifier value
414
415    my $collect = $gsdl_cgi->clean_param("collect");   
416    my $cl = $gsdl_cgi->clean_param("cl");
417   
418    # Establish collect_dir using defining 'site' along the way if GS3
419
420    my $site = undef;
421    my $isGSDL2 = undef;
422
423    if ($gsdl_cgi->greenstone_version() == 2) {
424        $isGSDL2 = 1;
425    }
426    else {
427        $isGSDL2 = 0;
428       
429        # GS3 (and possible future versions) make use of 'site'
430        $site = $gsdl_cgi->clean_param("site");   
431        if (!defined $site) {
432        $gsdl_cgi->generate_error("No site specified.");
433        }
434    }
435
436    generate_html_form($isGSDL2,$site,$collect,$cl);
437    }
438}
439
440
441
442&main();
Note: See TracBrowser for help on using the browser.