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

Last change on this file since 78 was 78, checked in by prjemian, 11 years ago

return choice of Styled HTML page (with XML as page source) - this is the default now, OR Raw XML (in an HTML "pre" element)

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