source: 1dwg/trunk/php/xmlWriter/index.php

Last change on this file was 313, checked in by prjemian, 5 years ago
  • refs #23
  • applied license text
  • cleaned up the Python binding documentation
  • added list of authors and contributors
  • for each binding, show how to get I(Q)
  • retrieve CanSas1dType.java from repository (example in the Java binding documentation calls for it)
  • Property svn:keywords set to Date Revision Author HeadURL Id
File size: 13.0 KB
Line 
1<?php
2
3########### SVN repository information ###################
4# $Date$
5# $Author$
6# $Revision$
7# $URL$
8# $Id$
9########### SVN repository information ###################
10
11# Copyright (c) 2013, UChicago Argonne, LLC
12# This file is distributed subject to a Software License Agreement found
13# in the file LICENSE that is included with this distribution.
14
15
16##### GLOBALS #####################################################################
17
18$tool['titleStr'] = "cansas1d:1.1 XML formatter";
19$tool['svnid'] = "\$Id$";
20$tool['email'] = "jemian@anl.gov";
21$tool['postMethod'] = 'POST';
22$tool['postAction'] = 'index.php';
23$tool['surveillance_file'] = './www/surveillance.xml';  // chmod 666
24$tool['meta,desc'] = "Formats SAS data in the cansas1d:1.1 XML data format.";
25$tool['meta,keys'] = "small-angle scattering, data format";
26$tool['canSAS_URL'] = "http://www.cansas.org/";
27
28# here are the form variables and descriptions
29$vars['title'] = 'Title';
30$vars['run'] = 'Run';
31$vars['sample_id'] = 'Sample ID';
32$vars['sample_thickness'] = 'thickness (mm)';
33$vars['sample_details'] = 'other sample details';
34$vars['instrument_name'] = 'SAS instrument name';
35$vars['instrument_radiation'] = '"neutron" or "xray" (no quotes)';
36$vars['instrument_wavelength'] = 'Wavelength (A)';
37$vars['detector_name'] = 'Detector name';
38$vars['detector_SDD'] = 'sample-detector distance (m)';
39$vars['SASnote'] = 'SASnote';
40$vars['SASdata'] = 'SAS data (3 columns: Q I Idev)';
41
42$process = 0;           // Should processing be run this time?
43$post = array();    // processing parameters to be used
44
45##### main body of code #####################################################################
46
47# look for any input parameters
48switch ($_SERVER["REQUEST_METHOD"]) {
49        case "":  # command-line processing
50                #$usage = 'usage: php ';
51                #$usage .= $_SERVER['SCRIPT_FILENAME'];
52                #$usage .= ' [undefined now]';
53                exit("command line not supported now");
54                break;
55        case "GET":
56                break;
57        case "POST":
58                $process = 1;
59                foreach ($_REQUEST as $key => $value) {
60                        $post[$key] = $value;
61                }
62                break;
63}
64
65try {
66   surveillance($post); # make a log entry
67} catch (Exception $e) {}
68
69# process the request
70if ($process == 1) {
71        $result = prepare_cansasxml($post);
72}
73
74switch ($_SERVER["REQUEST_METHOD"]) {
75        case "GET":
76                $page = buildHtmlPage($post);
77                print($page);
78                break;
79        case "POST":  # this is when the work gets done
80                if ($post['result_style'] == 'Styled') {
81                        header("Content-Type: text/xml");
82                        print($result);
83                }
84                if ($post['result_style'] == 'Raw XML') {
85                        header("Content-Type: text/html");
86                        print("<pre>\n");
87                        print(htmlentities($result));                   //  "<" to "&lt;" and similar
88                        print("</pre>\n");
89                }
90                break;
91        case "":  # command-line interface works here
92                print("No command-line interface at this time.");
93                break;
94}
95#phpInfo();
96
97####### function definitions ###################################################################
98
99
100function buildHtmlPage($post) {
101        global $tool;
102        global $vars;
103
104        $doc = new DOMDocument('1.0', 'UTF-8');
105
106        $root = addElement($doc, $doc, 'html');
107        addComment($doc, $root, $tool['titleStr']);
108
109        #--start-header------------------------------------
110        $head = addElement($doc, $root, 'head');
111        addTextElement($doc, $head, 'title', $tool['titleStr']);
112        $node = addElement($doc, $head, 'meta');
113        addAttribute($node, 'http-equiv', 'Content-Type');
114        addAttribute($node, 'content', 'text/html;charset=iso-8859-1');
115
116        $node = addElement($doc, $head, 'meta');
117        addAttribute($node, 'name', 'description');
118        addAttribute($node, 'content', $tool['meta,desc']);
119
120        $node = addElement($doc, $head, 'meta');
121        addAttribute($node, 'name', 'keywords');
122        addAttribute($node, 'content', $tool['meta,keys']);
123        #--end-header------------------------------------
124
125        #--start-body------------------------------------
126        $body = addElement($doc, $root, 'body');
127        addTextElement($doc, $body, 'h1', $tool['titleStr']);
128
129        #--start-form------------------------------------
130        addComment($doc, $body, ' start form ');
131        $form = addElement($doc, $body, 'form');
132        addAttribute($form, 'method', $tool['postMethod']);
133        addAttribute($form, 'action', $tool['postAction']);
134
135        addComment($doc, $form, ' start form table ');
136        $table = addElement($doc, $form, 'table');
137        addAttribute($table, 'border', '2');
138        foreach ($vars as $index => $value) {
139                $tr = addElement($doc, $table, 'tr');
140                addTextElement($doc, $tr, 'td', $value);
141                $td = addElement($doc, $tr, 'td');
142                $input = addElement($doc, $td, 'input');
143                addAttribute($input, 'type', 'text');
144                addAttribute($input, 'size', '50');
145                addAttribute($input, 'name', $index);
146                addAttribute($input, 'value', $post[$index]);
147        }
148        addComment($doc, $form, ' end form table ');
149
150        addComment($doc, $form, ' start form buttons ');
151
152        foreach (array("Styled", "Raw XML") as $item) {
153                $input = addTextElement($doc, $form, 'input', $item);
154                addAttribute($input, 'type', 'radio');
155                addAttribute($input, 'name', 'result_style');
156                addAttribute($input, 'value', $item);
157                if ($item == 'Styled') {
158                        addAttribute($input, 'checked', 'true');
159                }
160        }
161        foreach (array("Submit", "Reset") as $item) {
162                $input = addElement($doc, $form, 'input');
163                addAttribute($input, 'type', strtolower($item));
164                addAttribute($input, 'value', $item);
165        }
166        addComment($doc, $form, ' end form buttons ');
167
168        addComment($doc, $body, ' end form ');
169        #--end-form------------------------------------
170
171        #--start-content------------------------------------
172        addElement($doc, $body, 'hr');
173        addComment($doc, $body, ' start content ');
174
175        addTextElement($doc, $body, 'h2', 'Overview');
176        $p = addElement($doc, $body, 'p');
177        addText($doc, $p, 
178                'This WWW form provides a means to convert ' .
179                'one dimensional small-angle scattering data into ' .
180                'the XML format described by the '
181        );
182        $a = addElement($doc, $p, 'a');
183        addAttribute($a, 'href', $tool['canSAS_URL']);
184        addText($doc, $a, 'cansas1d:1.1 standard');
185        addText($doc, $p, 
186                '.  The WWW form returns the data in the XML format.'
187        );
188        addTextElement($doc, $body, 'h2', 'Hints');
189        $p = addElement($doc, $body, 'p');
190        addText($doc, $p, 
191                'The SASdata, delimited by white-space and/or commas, ' .
192                'will be parsed in triples of '
193        );
194        addTextElement($doc, $p, 'tt', 'Q I Idev');
195        addText($doc, $p, 
196                '.  It is ' .
197                'possible to copy/paste from a 3-column text file directly ' .
198                'into the SASdata entry box.'
199        );
200        addTextElement($doc, $body, 'h2', 'Results');
201        $p = addElement($doc, $body, 'p');
202        addText($doc, $p, 
203                'Output from the form can be either be formatted for nice display using the ' .
204                'standard canSAS style sheet ("Styled" radiobutton) or as "Raw XML."  ' .
205                'However, to see the raw XML output from Styled output, ' .
206                'use the "View Source" capability of your browser.  '
207        );
208
209        addComment($doc, $body, ' end content ');
210        #--end-content------------------------------------
211
212        #--start-footer------------------------------------
213        addElement($doc, $body, 'hr');
214        addComment($doc, $body, ' start footer ');
215
216        $small = addElement($doc, $body, 'small');
217        addText($doc, $small, 'For information about this page, contact ');
218
219        $node = addElement($doc, $small, 'a');
220        addAttribute($node, 'href', 'mailto:' . $tool['email']);
221        addText($doc, $node, $tool['email']);
222
223        addElement($doc, $body, 'br');
224
225        $idstr = trim(trim($tool['svnid'], "\$"));
226        $small = addTextElement($doc, $body, 'small', $idstr);
227
228        addComment($doc, $body, ' end footer ');
229        #--end-footer------------------------------
230
231        #--end-body------------------------------------
232
233        #print($doc->saveXML());
234        return(prettyXML($doc->saveXML()));
235}
236
237
238function prepare_cansasxml($post) {
239        global $tool;
240
241        $doc = new DOMDocument('1.0', 'UTF-8');
242
243        $xslt = $doc->createProcessingInstruction('xml-stylesheet', 
244                'type="text/xsl" href="cansas1d.xsl"');
245        $doc->appendChild($xslt);
246
247        $root = $doc->createElementNS('cansas1d:1.1','SASroot');
248        $doc->appendChild($root);
249        addComment($doc, $root, 'canSAS XML created by ' . $tool['titleStr']);
250
251        $xsi_url = 'http://www.w3.org/2001/XMLSchema-instance';
252        $schemaLocation = 'cansas1d:1.1 '
253           . 'http://www.cansas.org/svn/1dwg/trunk/cansas1d.xsd';
254        addAttribute($root, 'version', '1.0');
255        addAttribute($root, 'xmlns:xsi', $xsi_url);
256        addAttribute($root, 'xsi:schemaLocation', $schemaLocation);
257
258        $entry = addElement($doc, $root, 'SASentry');
259        addAttribute($entry, 'name', 'entry1');
260
261        addTextElement($doc, $entry, 'Title', $post['title']);
262        addTextElement($doc, $entry, 'Run', $post['run']);
263
264
265        $sasdata = addElement($doc, $entry, 'SASdata');
266        $data = preg_split("/[\s,]+/", trim($post['SASdata']));
267        $rows = count($data)/3;
268        for ($i = 0; $i < $rows; $i++) {
269          $idata = addElement($doc, $sasdata, 'Idata');
270          $node = addTextElement($doc, $idata, 'Q', $data[$i*3+0]);
271          addAttribute($node, 'unit', '1/A');
272          $node = addTextElement($doc, $idata, 'I', $data[$i*3+1]);
273          addAttribute($node, 'unit', '1/cm');
274          $node = addTextElement($doc, $idata, 'Idev', $data[$i*3+2]);
275          addAttribute($node, 'unit', '1/cm');
276        }
277
278
279        $sassample = addElement($doc, $entry, 'SASsample');
280        addTextElement($doc, $sassample, 'ID', $post['sample_id']);
281        $node = addTextElement($doc, $sassample, 'thickness', 
282                $post['sample_thickness']);
283        addAttribute($node, 'unit', 'mm');
284        # other nodes belong here
285        addTextElement($doc, $sassample, 'details', $post['sample_details']);
286
287        $sasinstrument = addElement($doc, $entry, 'SASinstrument');
288        addTextElement($doc, $sasinstrument, 'name', $post['instrument_name']);
289
290        $sassource = addElement($doc, $sasinstrument, 'SASsource');
291        addTextElement($doc, $sassource, 'radiation', 
292                $post['instrument_radiation']);
293        $node = addTextElement($doc, $sassource, 'wavelength', 
294                $post['instrument_wavelength']);
295        addAttribute($node, 'unit', 'A');
296
297        $sascollimation = addElement($doc, $sasinstrument, 
298                'SAScollimation');
299
300        $sasdetector = addElement($doc, $sasinstrument, 'SASdetector');
301        addTextElement($doc, $sasdetector, 'name', $post['detector_name']);
302
303        $node = addTextElement($doc, $sasdetector, 'SDD', $post['detector_SDD']);
304        addAttribute($node, 'unit', 'm');
305
306        $sasprocess = addElement($doc, $entry, 'SASprocess');
307        addTextElement($doc, $sasprocess, 'name', $tool['titleStr']);
308        addTextElement($doc, $sasprocess, 'date', PRJ_mysqlDate('now') );
309
310        $idstr = trim(trim($tool['svnid'], "\$"));
311        $node = addTextElement($doc, $sasprocess, 'SASprocessnote', $idstr);
312        addAttribute($node, 'name', 'svnid');
313
314        $str = 'formatting of text data into canSAS XML 1D standard';
315        $node = addTextElement($doc, $sasprocess, 'SASprocessnote', $str);
316        addAttribute($node, 'name', 'titleStr');
317
318        $sasnote = addElement($doc, $entry, 'SASnote');
319
320        return(prettyXML($doc->saveXML()));
321}
322
323
324function surveillance($post) {
325        global $tool;
326        $tags = array(
327                'REMOTE_HOST', 'REMOTE_ADDR', 'REQUEST_URI',
328                'SCRIPT_FILENAME', 'REQUEST_METHOD',
329                'HTTP_USER_AGENT', 'REQUEST_TIME'
330        );
331        $date = date('Y-m-d');
332        $time = date('H:i:s');
333
334        $doc = new DomDocument();
335        $doc->Load($tool['surveillance_file']);
336        $root = $doc->getElementsByTagName('cansasxml')->item(0);
337
338        $entry = addElement($doc, $root, 'entry');
339        addAttribute($entry, 'date', $date);
340        addAttribute($entry, 'time', $time);
341
342        $list = addElement($doc, $entry, 'sas_variables');
343        foreach ($post as $key => $value) {
344                if ($key != "result_style")  {
345                        $node = addTextElement($doc, $list, 'var', $value);
346                        addAttribute($node, 'name', $key);
347                }
348        }
349
350        $list = addElement($doc, $entry, 'server_variables');
351        foreach ($tags as $key) {
352                $node = addElement($doc, $list, 'var');
353                addAttribute($node, 'name', $key);
354                if (strlen($_SERVER[$key])>0) {
355                        addText($doc, $node, $_SERVER[$key]);
356                }
357        }
358       
359        $fp = fopen($tool['surveillance_file'], 'w');
360        fwrite($fp, prettyXML($doc->saveXML()));
361        fclose($fp);
362}
363
364
365function addElement($doc, $parent, $tag, $prefix = '') {
366        $node = $doc->createElement($tag, $prefix);
367        $parent->appendChild($node);
368        return($node);
369}
370
371
372function addAttribute($parent, $name, $value = '') {
373        $attr = $parent->setAttribute($name, $value);
374        $parent->appendChild($attr);
375        return($attr);
376}
377
378
379function addText($doc, $parent, $text = '') {
380        $node = $doc->createTextNode($text);
381        $parent->appendChild($node);
382        return($node);
383}
384
385
386function addComment($doc, $parent, $text = '') {
387        $node = $doc->createComment($text);
388        $parent->appendChild($node);
389        return($node);
390}
391
392
393function addTextElement($doc, $parent, $tag, $text) {
394        $node = addElement($doc, $parent, $tag);
395        addText($doc, $node, $text);
396        return($node);
397}
398
399
400function prettyXML($sXML) {
401        # Thanks to Joachem Blok on http://us3.php.net/domdocument
402        $doc = new DOMDocument();
403        $doc->preserveWhiteSpace = false;
404        $doc->formatOutput   = true;
405        $doc->loadXML($sXML);
406        return($doc->saveXML());
407}
408
409
410// PRJ_mysqlDate
411// ===============
412// standardized date as string in MySQL date format
413//  returns a formatted string
414// (relative to the given timebase)
415// which can be rescanned by this routine
416function PRJ_mysqlDate( $dateStr, $relative = "now" ) {
417  $now = strtotime( $relative );
418  $exact = strtotime ( $dateStr, $now );
419
420  $dateArr = getdate( $exact );
421  $ts = mktime($dateArr['hours'], $dateArr['minutes'], $dateArr['seconds'],
422    $dateArr['mon'], $dateArr['mday'], $dateArr['year']);
423  $dateArr = getdate( $ts );
424  $str = sprintf ( "%04d-%02d-%02d %02d:%02d:%02d",
425    $dateArr['year'], $dateArr['mon'], $dateArr['mday'],
426    $dateArr['hours'], $dateArr['minutes'], $dateArr['seconds'] );
427  return ( $str );
428}
429
430?>
Note: See TracBrowser for help on using the repository browser.