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

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

Updated a comment regarding the method for retrieving metadata.

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         
258          console.log("******");
259          console.log(expFrame);
260         
261          //alert(expFrame);
262
263          var collect = document.getElementById("collect").value;
264          var site    = document.getElementById("site").value;
265
266          var url = "cgi-bin/html-to-expeditee.pl";
267          var params = "c=" + collect;
268          if (site.match(/\\w/)) {
269            params += "&site=" + site;
270          }
271         
272          //params += "&a=generate-frame&fn=" + iter;
273          params += "&a=generate-frame&fn=" + frameNum;
274          params += "&json=" + escape(expFrame);
275         
276          //add an assocfilepath parameter but only if it is defined.
277          if(assoc !== null){
278            params += "&assoc=" + assoc;
279          }
280
281          var clHtml = urlPostSync(url,params);
282
283          if (!clHtml.match(/html-to-expeditee saved frame/)) {
284            alert("Error processing url: " + url);
285          }
286
287          if (docOIDs.length>0) {
288          var docOID = docOIDs.shift();
289         
290          // console.log("doc oid = " + docOID);
291
292         // is the following line used ????
293          var cl = document.getElementById("cl").value;
294         
295          var gs2 = $isGSDL2;
296              var url;
297
298              if (gs2) {
299                  url = "library.cgi";
300                  url += "?c="+collect +"&a=d&d=" + docOID;
301              }
302              else {
303                  url = "library";
304                  url += "?c="+collect +"&a=d&d=" + docOID;
305                 
306                  /** Refer to comment earlier in this code in regards to the commented out line below.**/
307                  //url += "&ed=1&dt=hierarchy";
308                  // url += "&excerptid=gs_content";
309              }
310
311          //url += "&p.showExpediteeAttributes=1";
312            url += "&p.showAssocFilePath=1";
313         
314            iframe.src = url;
315          }
316          else {
317            var progressbar = document.getElementById("progressbar");
318            progressbar.style.display = "none";
319
320            iframe.style.display = "none";
321            delete iframe.src;
322          }
323      }
324     
325      }
326     
327    /**
328    * This method is used at this stage to retrieve assocfilepath
329    * and frame number metadata values from the document's xml.
330    **/
331    function getMetadata(xmlUrl,nameValue){
332     
333        var metadata = null;
334       
335         \$.ajax({
336            type: "GET",
337            async: false,
338            url: xmlUrl,
339            dataType: "xml",
340            success: function(xml){
341               
342                               
343                \$(xml).find('metadata').each(function(){
344                   
345                    var name = \$(this).attr('name');
346                   
347                    if(name === nameValue){
348                        if(metadata === null){
349                            metadata = \$(this).text();
350                            //console.log(metadata);
351                        }
352                       
353                    }   
354                });
355               
356            }
357           
358          });
359       
360        return metadata;
361      }
362
363    </script>
364
365    <div id="progressbar" width="100%"
366          style="display: none; margin: 10px; height: 10px;"></div>
367    <div id="workingTraverse" style="display: none"></div>
368
369    <hr style="margin: 10px;">
370
371    <iframe width="100%" id="iframe" style="display: none;"
372            onload="pageLoaded()"></iframe>
373
374  </body>
375</html>
376EOT
377
378    print "Content-type:text/html\n\n";
379    print $html_form;
380}
381
382sub main
383{
384
385#    $ENV{'QUERY_STRING'} = "a=...";set-import-metadata&c=espresso-music&d=HASH012d6f72cde5dc48162f4a1d.1&metaname=annotation&metapos=0&metavalue=adfadfad";
386#    $ENV{'REQUEST_METHOD'} = "GET";
387
388    my $gsdl_cgi = new gsdlCGI();
389
390    # Load the Greenstone modules that we need to use
391    $gsdl_cgi->setup_gsdl();
392
393    my $gsdlhome = $ENV{'GSDLHOME'};   
394    $gsdl_cgi->checked_chdir($gsdlhome);
395
396    require cgiactions::HtmlToExpediteeAction;
397   
398    # Useful debug statement for seeing what packages have been included
399####    printf("%-45s%-s\n",$_,$INC{$_}) foreach (sort keys %INC);
400   
401    $gsdl_cgi->parse_cgi_args();
402
403    # We don't want the gsdlCGI module to return errors and warnings in XML
404    $gsdl_cgi->{'xml'} = 0;
405
406    my $fn = $gsdl_cgi->clean_param("fn");     # frame number
407
408    if (defined $fn) {
409
410    my $action = new HtmlToExpediteeAction($gsdl_cgi,$iis6_mode);
411
412    $action->do_action();
413    }
414    else {
415    # generate form, pre-filled out with any useful values such
416    # as the collection and classifier value
417
418    my $collect = $gsdl_cgi->clean_param("collect");   
419    my $cl = $gsdl_cgi->clean_param("cl");
420   
421    # Establish collect_dir using defining 'site' along the way if GS3
422
423    my $site = undef;
424    my $isGSDL2 = undef;
425
426    if ($gsdl_cgi->greenstone_version() == 2) {
427        $isGSDL2 = 1;
428    }
429    else {
430        $isGSDL2 = 0;
431       
432        # GS3 (and possible future versions) make use of 'site'
433        $site = $gsdl_cgi->clean_param("site");   
434        if (!defined $site) {
435        $gsdl_cgi->generate_error("No site specified.");
436        }
437    }
438
439    generate_html_form($isGSDL2,$site,$collect,$cl);
440    }
441}
442
443
444
445&main();
Note: See TracBrowser for help on using the browser.