source: subversion/sites/other/freemap-npe/rules.php @ 5551

Last change on this file since 5551 was 1540, checked in by nick, 13 years ago

Freemap-NPE: initial version

File size: 3.7 KB
Line 
1<?php
2################################################################################
3# This file forms part of the Freemap source code.                             #
4# (c) 2004-06 Nick Whitelegg (Hogweed Software)                                #
5# Licenced under the Lesser GNU General Public Licence; see COPYING            #
6# for details.                                                                 #
7################################################################################
8require_once('defines.php');
9//header("Content-type: text/xml");
10
11#globals
12$suppliedKeyvals = null;
13$inDoc=$inRule=$inCondition=$inStyle=$inGpsmapcode=$inGpstype=false;
14$curConditions=null;
15$curRule=null;
16$rules = array();
17#end globals
18
19function readStyleRules($rulefile)
20{
21        global $rules;
22
23        $parser = xml_parser_create();
24        xml_set_element_handler($parser,"on_start_element_rules",
25                                "on_end_element_rules");
26        xml_set_character_data_handler($parser,"on_characters_rules");
27
28        $fp = fopen($rulefile,"r");
29        while($line=fread($fp,4096))
30        {
31                if(!xml_parse($parser,$line))
32                {
33                        fclose($fp);
34                        return false;
35                }
36        }
37
38        fclose($fp);
39        xml_parser_free($parser);
40        return $rules; 
41}
42
43#NB the PHP expat library reads in all tags as capitals - even if they're
44#lower case!!!
45function on_start_element_rules($parser,$element,$attrs)
46{
47        global $inDoc, $inRule, $curConditions, $inCondition, $curRule,
48                        $inStyle, $inGpsmapcode, $inGpstype;
49
50        if($element=="RULESET")
51        {
52                $inDoc = true;
53        }
54        elseif($inDoc)
55        {
56                if($element=="RULE")
57                {
58                        $inRule=true;
59                        $curRule = array();
60                }
61                elseif($element=="CONDITION" && $inRule)
62                {
63                        $inCondition=true;
64                        if(isset($attrs["K"]) && isset($attrs["V"]))
65                                $curRule["conditions"][$attrs["K"]]=$attrs["V"];
66                }
67                elseif($element=="STYLE" && $inRule)
68                {
69                        $inStyle=true;
70                        foreach($attrs as $name => $value)
71                                $curRule[strtolower($name)] = $value;
72                }
73                elseif($element=="GPSMAPCODE" && $inRule)
74                        $inGpsmapcode = true;
75                elseif($element=="GPSTYPE" && $inRule)
76                        $inGpstype = true;
77        }
78}
79
80function on_end_element_rules($parser,$element)
81{
82        global $inDoc, $inRule, $curConditions, $inCondition, $curRule,
83                        $inStyle, $rules, $inGpsmapcode, $inGpstype;
84
85        if($element=="RULESET")
86                $inDoc = false;
87        elseif($inDoc && $element=="RULE")
88        {
89                $inRule = false;
90                $rules[] = $curRule;
91        }
92        elseif($inRule && $element=="CONDITION")
93                $inCondition = false;
94        elseif($inRule && $element=="STYLE")
95                $inStyle = false;
96        elseif($element=="GPSMAPCODE" && $inRule)
97                $inGpsmapcode = false;
98        elseif($element=="GPSTYPE" && $inRule)
99                $inGpstype = false;
100}
101
102function on_characters_rules($parser, $characters)
103{
104        global $curRule, $inGpsmapcode, $inGpstype;
105        if($inGpsmapcode)
106                $curRule["gpsmapcode"] = $characters;
107        elseif($inGpstype)
108                $curRule["gpstype"] = $characters;
109}
110
111function getStyle($rules,$suppliedKeyvals)
112{
113        $prevHit = 0;
114        $style=null;
115        // defaults
116
117        foreach($rules as $curRule)
118        {
119                $hit = 0;
120                // Go through all supplied Keyvals
121                if(!is_array($suppliedKeyvals))
122        {                       echo "not an array"; return; }
123
124                foreach($suppliedKeyvals as $k=>$v)
125                {
126                        // If the current ruleset includes the current key...
127                        if(isset($curRule["conditions"][$k]))
128                        {
129                                // If key and value match, increase no. of hits
130                                if($curRule["conditions"][$k]==$v)
131                                {
132                                        $hit++;
133                                }
134                                // If values are different, we definitely don't want this rule
135                                else
136                                {
137                                        $hit=0;
138                                        break;
139                                }
140                        }
141                }
142                // If more rule "hits" this time, this is seen as greater specificity,
143                // so take on this rule
144                if($hit > $prevHit)
145                {
146                        $style=array();
147                        foreach($curRule as $k=>$v)
148                                if($k!="conditions")
149                                        $style[$k] = $v; 
150                        $prevHit = $hit;
151                }
152        }
153
154        /*
155        if(!isset($style["dash"]) && !isset($style["casing"]))
156                $style["casing"] = "0,0,0";
157        */
158
159        return $style;
160}
161
162?>
Note: See TracBrowser for help on using the repository browser.