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

Last change on this file since 74 was 74, checked in by prjemian, 10 years ago

tweak instructions; add XSLT to view surveillance log (could add analysis with PHP code in a www/index.php file)

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