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

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

beautification

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