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

Last change on this file since 80 was 80, checked in by prjemian, 12 years ago

trim the dollar signs from the SVN ID when it is used inside an XML element of the result (avoids later modification by version control if the data file is put under version control)

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