source: classes/phing/util/properties/PropertyFileReader.php @ a05f680

Last change on this file since a05f680 was a05f680, checked in by Matthias Pigulla <mp@…>, 3 years ago

Fix for what I broke in [1144] :(

  • Property mode set to 100644
File size: 2.8 KB
Line 
1<?php
2/**
3 * Reads property files into a PropertySet.
4 * @author Matthias Pigulla <mp@webfactory.de>
5 */
6class PropertyFileReader {
7
8        protected $properties;
9       
10        public function __construct(PropertySet $s) {
11                $this->properties = $s;
12        }
13       
14         /**
15     * Load properties from a file.
16     *
17     * @param PhingFile $file
18     * @return void
19     * @throws IOException - if unable to read file.
20     */
21    public function load(PhingFile $file, $section = null) {
22        if ($file->canRead()) {
23            $this->parse($file->getPath(), $section);                   
24        } else {
25            throw new IOException("Can not read file ".$file->getPath());
26        }
27       
28    }
29   
30    protected function parse($filePath, $section) {
31
32        $section = (string) $section;
33       
34        // load() already made sure that file is readable               
35        // but we'll double check that when reading the file into
36        // an array
37
38        if (($lines = @file($filePath)) === false) {
39            throw new IOException("Unable to parse contents of $filePath");
40        }
41       
42        $currentSection = '';
43        $sect = array($currentSection => array(), $section => array());
44        $depends = array();
45       
46        foreach ($lines as $l) {
47                if (!($l = trim($l))) 
48                        continue;
49               
50                if ($l[0] == '#' || $l[0] == ';')
51                        continue;
52
53                if (preg_match('/^\[(\w+)(?:\s*:\s*(\w+))?\]$/', $l, $matches)) {
54                        $currentSection = $matches[1];
55                        $sect[$currentSection] = array();
56                        if (isset($matches[2])) $depends[$currentSection] = $matches[2];
57                        continue;
58                }
59               
60                        $pos = strpos($l, '=');
61                        $name = trim(substr($l, 0, $pos));
62                        $value = $this->inVal(trim(substr($l, $pos + 1)));
63
64                        /*
65                         * Take care: Property file may contain identical keys like
66                         * a[] = first
67                         * a[] = second
68                         */
69                        $sect[$currentSection][] = array($name, $value);
70        }
71       
72        $dependencyOrder = array();
73        while ($section) {
74                array_unshift($dependencyOrder, $section);
75                $section = isset($depends[$section]) ? $depends[$section] : '';
76        }
77        array_unshift($dependencyOrder, '');
78
79        foreach ($dependencyOrder as $section) 
80                foreach ($sect[$section] as $def) {
81                        list ($name, $value) = $def;
82                        $this->properties[$name] = $value;
83                } 
84    }
85   
86    /**
87     * Process values when being read in from properties file.
88     * does things like convert "true" => true
89     * @param string $val Trimmed value.
90     * @return mixed The new property value (may be boolean, etc.)
91     */
92    protected function inVal($val) {
93        if ($val === "true") { 
94            $val = true;
95        } elseif ($val === "false") { 
96            $val = false; 
97        }
98        return $val;
99    }
100       
101       
102}
Note: See TracBrowser for help on using the repository browser.