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

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

update the instructions

  • 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 can be either be formatted for nice display using the ' .
196                'standard canSAS style sheet ("Styled" radiobutton) or as "Raw XML."  ' .
197                'However, to see the raw XML output from Styled output, ' .
198                'use the "View Source" capability of your browser.  '
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.