├── .gitignore
├── .project
├── README.md
├── bootstrap.min.css
├── build
├── README.txt
├── build.py
├── buildUncompressed.py
├── full.cfg
├── library.cfg
├── license.txt
├── lite.cfg
├── matrix.cfg
├── osmatrix.min.js
└── tools
│ ├── BeautifulSoup.py
│ ├── README.txt
│ ├── exampleparser.py
│ ├── jsmin.c
│ ├── jsmin.py
│ ├── jsmin.pyc
│ ├── mergejs.py
│ ├── mergejs.pyc
│ ├── minimize.py
│ ├── oldot.py
│ ├── release.sh
│ ├── shrinksafe.py
│ ├── toposort.py
│ ├── toposort.pyc
│ └── update_dev_dir.sh
├── img
├── ajax-loader.gif
├── ajax-loader_head.gif
├── giscience_logo.png
└── icons.png
├── index.html
├── js
├── control.js
├── event.js
├── geocoder.js
├── geolocator.js
├── lib
│ ├── d3.v3.min.js
│ ├── leaflet-0.5.1.css
│ ├── leaflet-0.5.1.ie.css
│ └── leaflet-0.5.1.js
├── map.js
├── osmatrix.js
├── permalink.js
└── ui.js
├── license.txt
└── style.css
/.gitignore:
--------------------------------------------------------------------------------
1 | .project
--------------------------------------------------------------------------------
/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | osmatrix-client
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # This repository is no longer maintained!
2 |
3 | # OSMatrix
4 |
5 | OSMatrix is a web-based application to visualize characteristics of OpenStreetMap, which are usually not displayed in cartographic representations of the data. The characteristics include information on the topicality of data, user contributions and the presence (or absence) of certain feature types.
6 |
7 | OSMatrix is based on an idea of Alexander Zipf has been brought to life by Lukas Loos and Oliver Roick at [GIScience Research Group](http://giscience.uni-hd.de) at Heidelberg University.
8 |
9 | ## Licence
10 |
11 | (The MIT Licence)
12 |
13 | Copyright (c) 2013 Oliver Roick
14 |
15 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
16 |
17 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
18 |
19 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 |
--------------------------------------------------------------------------------
/bootstrap.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v2.3.1
3 | *
4 | * Copyright 2012 Twitter, Inc
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 | */
10 | .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;}
11 | .clearfix:after{clear:both;}
12 | .hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
13 | .input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
14 | form{margin:0 0 20px;}
15 | fieldset{padding:0;margin:0;border:0;}
16 | legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:19.5px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;}
17 | label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:20px;}
18 | input,button,select,textarea{font-family:'Droid Sans','Helvetica Neue',Helvetica,Arial,sans-serif;}
19 | label{display:block;margin-bottom:5px;}
20 | select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:13px;line-height:20px;color:#555555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle;}
21 | input,textarea,.uneditable-input{width:206px;}
22 | textarea{height:auto;}
23 | textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);}
24 | input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;}
25 | input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;}
26 | select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;}
27 | select{width:220px;border:1px solid #cccccc;background-color:#ffffff;}
28 | select[multiple],select[size]{height:auto;}
29 | select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
30 | .uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
31 | .uneditable-input{overflow:hidden;white-space:nowrap;}
32 | .uneditable-textarea{width:auto;height:auto;}
33 | input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;}
34 | input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;}
35 | input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;}
36 | .radio,.checkbox{min-height:20px;padding-left:20px;}
37 | .radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px;}
38 | .controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
39 | .radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
40 | .radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
41 | .input-mini{width:60px;}
42 | .input-small{width:90px;}
43 | .input-medium{width:150px;}
44 | .input-large{width:210px;}
45 | .input-xlarge{width:270px;}
46 | .input-xxlarge{width:530px;}
47 | input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;}
48 | .input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;}
49 | input,textarea,.uneditable-input{margin-left:0;}
50 | .controls-row [class*="span"]+[class*="span"]{margin-left:20px;}
51 | input.span12,textarea.span12,.uneditable-input.span12{width:926px;}
52 | input.span11,textarea.span11,.uneditable-input.span11{width:846px;}
53 | input.span10,textarea.span10,.uneditable-input.span10{width:766px;}
54 | input.span9,textarea.span9,.uneditable-input.span9{width:686px;}
55 | input.span8,textarea.span8,.uneditable-input.span8{width:606px;}
56 | input.span7,textarea.span7,.uneditable-input.span7{width:526px;}
57 | input.span6,textarea.span6,.uneditable-input.span6{width:446px;}
58 | input.span5,textarea.span5,.uneditable-input.span5{width:366px;}
59 | input.span4,textarea.span4,.uneditable-input.span4{width:286px;}
60 | input.span3,textarea.span3,.uneditable-input.span3{width:206px;}
61 | input.span2,textarea.span2,.uneditable-input.span2{width:126px;}
62 | input.span1,textarea.span1,.uneditable-input.span1{width:46px;}
63 | .controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;}
64 | .controls-row:after{clear:both;}
65 | .controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left;}
66 | .controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px;}
67 | input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;}
68 | input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;}
69 | .control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
70 | .control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;}
71 | .control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;}
72 | .control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
73 | .control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
74 | .control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;}
75 | .control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;}
76 | .control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
77 | .control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
78 | .control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;}
79 | .control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;}
80 | .control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
81 | .control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;}
82 | .control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;}
83 | .control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;}
84 | .control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;}
85 | input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
86 | .form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;}
87 | .form-actions:after{clear:both;}
88 | .help-block,.help-inline{color:#595959;}
89 | .help-block{display:block;margin-bottom:10px;}
90 | .help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}
91 | .input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:13px;}
92 | .input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2;}
93 | .input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:13px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;}
94 | .input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
95 | .input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;}
96 | .input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}
97 | .input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
98 | .input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
99 | .input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px;}
100 | .input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
101 | .input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
102 | .input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
103 | .input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
104 | .input-prepend.input-append .btn-group:first-child{margin-left:0;}
105 | input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
106 | .form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
107 | .form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
108 | .form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
109 | .form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
110 | .form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
111 | .form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;}
112 | .form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
113 | .form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;}
114 | .form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}
115 | .form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}
116 | .form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;}
117 | .control-group{margin-bottom:10px;}
118 | legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;}
119 | .form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;}
120 | .form-horizontal .control-group:after{clear:both;}
121 | .form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;}
122 | .form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:180px;}
123 | .form-horizontal .help-block{margin-bottom:0;}
124 | .form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px;}
125 | .form-horizontal .form-actions{padding-left:180px;}
126 | .btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:13px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #cccccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;}
127 | .btn:active,.btn.active{background-color:#cccccc \9;}
128 | .btn:first-child{*margin-left:0;}
129 | .btn:hover,.btn:focus{color:#333333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
130 | .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
131 | .btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
132 | .btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
133 | .btn-large{padding:11px 19px;font-size:16.25px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
134 | .btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px;}
135 | .btn-small{padding:2px 10px;font-size:11.049999999999999px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
136 | .btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0;}
137 | .btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px;}
138 | .btn-mini{padding:0 6px;font-size:9.75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
139 | .btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
140 | .btn-block+.btn-block{margin-top:5px;}
141 | input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%;}
142 | .btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}
143 | .btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(to bottom, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#0044cc;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;}
144 | .btn-primary:active,.btn-primary.active{background-color:#003399 \9;}
145 | .btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;}
146 | .btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
147 | .btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;}
148 | .btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
149 | .btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;}
150 | .btn-success:active,.btn-success.active{background-color:#408140 \9;}
151 | .btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;}
152 | .btn-info:active,.btn-info.active{background-color:#24748c \9;}
153 | .btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;}
154 | .btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
155 | button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
156 | button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}
157 | button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}
158 | button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}
159 | .btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
160 | .btn-link{border-color:transparent;cursor:pointer;color:#0088cc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
161 | .btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent;}
162 | .btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333333;text-decoration:none;}
163 | .btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;}
164 | .btn-group+.btn-group{margin-left:5px;}
165 | .btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px;}
166 | .btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
167 | .btn-group>.btn+.btn{margin-left:-1px;}
168 | .btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:13px;}
169 | .btn-group>.btn-mini{font-size:9.75px;}
170 | .btn-group>.btn-small{font-size:11.049999999999999px;}
171 | .btn-group>.btn-large{font-size:16.25px;}
172 | .btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
173 | .btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
174 | .btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
175 | .btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
176 | .btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;}
177 | .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
178 | .btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;}
179 | .btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;}
180 | .btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;}
181 | .btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;}
182 | .btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
183 | .btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;}
184 | .btn-group.open .btn-primary.dropdown-toggle{background-color:#0044cc;}
185 | .btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;}
186 | .btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;}
187 | .btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;}
188 | .btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;}
189 | .btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;}
190 | .btn .caret{margin-top:8px;margin-left:0;}
191 | .btn-large .caret{margin-top:6px;}
192 | .btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;}
193 | .btn-mini .caret,.btn-small .caret{margin-top:8px;}
194 | .dropup .btn-large .caret{border-bottom-width:5px;}
195 | .btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
196 | .btn-group-vertical{display:inline-block;*display:inline;*zoom:1;}
197 | .btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
198 | .btn-group-vertical>.btn+.btn{margin-left:0;margin-top:-1px;}
199 | .btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
200 | .btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
201 | .btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;}
202 | .btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
--------------------------------------------------------------------------------
/build/README.txt:
--------------------------------------------------------------------------------
1 |
2 | ## HowTo: Build & deploy "Shrunk" Single File Library version of OpenLayers ##
3 |
4 | * Build:
5 |
6 | cd build
7 | ./build.py
8 | cd ..
9 |
10 | * Upload the result to the server: e.g.
11 |
12 | scp build/OpenLayers.js openlayers@openlayers.org:openlayers.org/htdocs/code/
13 |
14 |
15 |
--------------------------------------------------------------------------------
/build/build.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | import sys
4 | sys.path.append("tools")
5 | import mergejs
6 |
7 | def build():
8 | have_compressor = None
9 | try:
10 | import jsmin
11 | have_compressor = "jsmin"
12 | except ImportError:
13 | try:
14 | import minimize
15 | have_compressor = "minimize"
16 | except Exception, E:
17 | print E
18 | pass
19 |
20 | sourceDirectory = "../js"
21 | configFilename = "matrix.cfg"
22 | outputFilename = "osmatrix.min.js"
23 |
24 | if len(sys.argv) > 1:
25 | configFilename = sys.argv[1]
26 | extension = configFilename[-4:]
27 |
28 | if extension != ".cfg":
29 | configFilename = sys.argv[1] + ".cfg"
30 |
31 | if len(sys.argv) > 2:
32 | outputFilename = sys.argv[2]
33 |
34 | print "Merging libraries."
35 | merged = mergejs.run(sourceDirectory, None, configFilename)
36 | if have_compressor == "jsmin":
37 | print "Compressing using jsmin."
38 | minimized = jsmin.jsmin(merged)
39 | elif have_compressor == "minimize":
40 | print "Compressing using minimize."
41 | minimized = minimize.minimize(merged)
42 | else: # fallback
43 | print "Not compressing."
44 | minimized = merged
45 | # print "Adding license file."
46 | # minimized = file("license.txt").read() + minimized
47 |
48 | print "Writing to %s." % outputFilename
49 | file(outputFilename, "w").write(minimized)
50 |
51 | print "Done."
52 |
53 | if __name__ == '__main__':
54 | build()
--------------------------------------------------------------------------------
/build/buildUncompressed.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | import sys
4 | sys.path.append("../tools")
5 |
6 | import jsmin, mergejs
7 |
8 | sourceDirectory = "../lib"
9 | configFilename = "full.cfg"
10 | outputFilename = "OpenLayers.js"
11 |
12 | if len(sys.argv) > 1:
13 | configFilename = sys.argv[1] + ".cfg"
14 | if len(sys.argv) > 2:
15 | outputFilename = sys.argv[2]
16 |
17 | print "Merging libraries."
18 | merged = mergejs.run(sourceDirectory, None, configFilename)
19 | print "Adding license file."
20 | merged = file("license.txt").read() + merged
21 |
22 | print "Writing to %s." % outputFilename
23 | file(outputFilename, "w").write(merged)
24 |
25 | print "Done."
26 |
--------------------------------------------------------------------------------
/build/full.cfg:
--------------------------------------------------------------------------------
1 | # This is the full build with all files: this includes the vector-related files
2 | # like Renderers and Formats.
3 |
4 | [first]
5 | OpenLayers/SingleFile.js
6 | OpenLayers.js
7 | OpenLayers/BaseTypes.js
8 | OpenLayers/BaseTypes/Class.js
9 | OpenLayers/Util.js
10 | Rico/Corner.js
11 |
12 | [last]
13 |
14 | [include]
15 |
16 | [exclude]
17 | Firebug/firebug.js
18 | Firebug/firebugx.js
19 | OpenLayers/Lang/ca.js
20 | OpenLayers/Lang/cs-CZ.js
21 | OpenLayers/Lang/da-DK.js
22 | OpenLayers/Lang/de.js
23 | OpenLayers/Lang/en-CA.js
24 | OpenLayers/Lang/es.js
25 | OpenLayers/Lang/fr.js
26 | OpenLayers/Lang/it.js
27 | OpenLayers/Lang/nb.js
28 | OpenLayers/Lang/nl.js
29 | OpenLayers/Lang/pt-BR.js
30 | OpenLayers/Lang/sv-SE.js
31 | OpenLayers/Lang/zh-TW.js
32 | OpenLayers/Lang/zh-CN.js
33 |
--------------------------------------------------------------------------------
/build/library.cfg:
--------------------------------------------------------------------------------
1 | # This file includes the OpenLayers code to create a build for everything that
2 | # does not require vector support. build.py uses this profile if no other one
3 | # is specified.
4 |
5 | [first]
6 | OpenLayers/SingleFile.js
7 | OpenLayers.js
8 | OpenLayers/BaseTypes.js
9 | OpenLayers/BaseTypes/Class.js
10 | OpenLayers/Util.js
11 | Rico/Corner.js
12 |
13 | [last]
14 |
15 | [include]
16 |
17 | [exclude]
18 | Firebug/firebug.js
19 | Firebug/firebugx.js
20 | OpenLayers/Format/GeoRSS.js
21 | OpenLayers/Format/GML.js
22 | OpenLayers/Format/WKT.js
23 | OpenLayers/Format/KML.js
24 | OpenLayers/Format/WFS.js
25 | OpenLayers/Format.js
26 | OpenLayers/Handler/Path.js
27 | OpenLayers/Handler/Point.js
28 | OpenLayers/Handler/Polygon.js
29 | OpenLayers/Handler/Select.js
30 | OpenLayers/Geometry/Collection.js
31 | OpenLayers/Geometry/Curve.js
32 | OpenLayers/Geometry/LinearRing.js
33 | OpenLayers/Geometry/LineString.js
34 | OpenLayers/Geometry/MultiLineString.js
35 | OpenLayers/Geometry/MultiPoint.js
36 | OpenLayers/Geometry/MultiPolygon.js
37 | OpenLayers/Geometry/Point.js
38 | OpenLayers/Geometry/Polygon.js
39 | OpenLayers/Geometry/Rectangle.js
40 | OpenLayers/Geometry/Surface.js
41 | OpenLayers/Geometry.js
42 | OpenLayers/Layer/GML.js
43 | OpenLayers/Layer/Vector.js
44 | OpenLayers/Control/DrawFeature.js
45 | OpenLayers/Control/EditingToolbar.js
46 | OpenLayers/Control/SelectFeature.js
47 | OpenLayers/Feature/Vector.js
48 | OpenLayers/Renderer
49 | OpenLayers/Renderer/Elements.js
50 | OpenLayers/Renderer/SVG.js
51 | OpenLayers/Renderer/VML.js
52 | OpenLayers/Renderer.js
53 | OpenLayers/Lang/ca.js
54 | OpenLayers/Lang/cs-CZ.js
55 | OpenLayers/Lang/da-DK.js
56 | OpenLayers/Lang/de.js
57 | OpenLayers/Lang/en-CA.js
58 | OpenLayers/Lang/es.js
59 | OpenLayers/Lang/fr.js
60 | OpenLayers/Lang/it.js
61 | OpenLayers/Lang/nb.js
62 | OpenLayers/Lang/nl.js
63 | OpenLayers/Lang/pt-BR.js
64 | OpenLayers/Lang/sv-SE.js
65 | OpenLayers/Lang/zh-TW.js
66 | OpenLayers/Lang/zh-CN.js
67 |
68 |
69 |
--------------------------------------------------------------------------------
/build/license.txt:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | OpenLayers.js -- OpenLayers Map Viewer Library
4 |
5 | Copyright 2005-2010 OpenLayers Contributors, released under the Clear BSD
6 | license. Please see http://svn.openlayers.org/trunk/openlayers/license.txt
7 | for the full text of the license.
8 |
9 | Includes compressed code under the following licenses:
10 |
11 | (For uncompressed versions of the code used please see the
12 | OpenLayers SVN repository: )
13 |
14 | */
15 |
16 | /* Contains portions of Prototype.js:
17 | *
18 | * Prototype JavaScript framework, version 1.4.0
19 | * (c) 2005 Sam Stephenson
20 | *
21 | * Prototype is freely distributable under the terms of an MIT-style license.
22 | * For details, see the Prototype web site: http://prototype.conio.net/
23 | *
24 | *--------------------------------------------------------------------------*/
25 |
26 | /**
27 | *
28 | * Contains portions of Rico
29 | *
30 | * Copyright 2005 Sabre Airline Solutions
31 | *
32 | * Licensed under the Apache License, Version 2.0 (the "License"); you
33 | * may not use this file except in compliance with the License. You
34 | * may obtain a copy of the License at
35 | *
36 | * http://www.apache.org/licenses/LICENSE-2.0
37 | *
38 | * Unless required by applicable law or agreed to in writing, software
39 | * distributed under the License is distributed on an "AS IS" BASIS,
40 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
41 | * implied. See the License for the specific language governing
42 | * permissions and limitations under the License.
43 | *
44 | **/
45 |
46 | /**
47 | * Contains XMLHttpRequest.js
48 | * Copyright 2007 Sergey Ilinsky (http://www.ilinsky.com)
49 | *
50 | * Licensed under the Apache License, Version 2.0 (the "License");
51 | * you may not use this file except in compliance with the License.
52 | * You may obtain a copy of the License at
53 | * http://www.apache.org/licenses/LICENSE-2.0
54 | */
55 |
56 | /**
57 | * Contains portions of Gears
58 | *
59 | * Copyright 2007, Google Inc.
60 | *
61 | * Redistribution and use in source and binary forms, with or without
62 | * modification, are permitted provided that the following conditions are met:
63 | *
64 | * 1. Redistributions of source code must retain the above copyright notice,
65 | * this list of conditions and the following disclaimer.
66 | * 2. Redistributions in binary form must reproduce the above copyright notice,
67 | * this list of conditions and the following disclaimer in the documentation
68 | * and/or other materials provided with the distribution.
69 | * 3. Neither the name of Google Inc. nor the names of its contributors may be
70 | * used to endorse or promote products derived from this software without
71 | * specific prior written permission.
72 | *
73 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
74 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
75 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
76 | * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
77 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
78 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
79 | * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
80 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
81 | * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
82 | * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
83 | *
84 | * Sets up google.gears.*, which is *the only* supported way to access Gears.
85 | *
86 | * Circumvent this file at your own risk!
87 | *
88 | * In the future, Gears may automatically define google.gears.* without this
89 | * file. Gears may use these objects to transparently fix bugs and compatibility
90 | * issues. Applications that use the code below will continue to work seamlessly
91 | * when that happens.
92 | */
93 |
--------------------------------------------------------------------------------
/build/lite.cfg:
--------------------------------------------------------------------------------
1 | # This file includes a small subset of OpenLayers code, designed to be
2 | # integrated into another application. It includes only the Layer types
3 | # neccesary to create tiled or untiled WMS, and does not include any Controls.
4 | # This is the result of what was at the time called "Webmap.js" at the FOSS4G
5 | # Web Mapping BOF.
6 |
7 | [first]
8 | OpenLayers/SingleFile.js
9 | OpenLayers.js
10 | OpenLayers/BaseTypes.js
11 | OpenLayers/BaseTypes/Class.js
12 | OpenLayers/Util.js
13 |
14 | [last]
15 |
16 | [include]
17 | OpenLayers/Map.js
18 | OpenLayers/Layer/WMS.js
19 |
20 | [exclude]
21 |
22 |
23 |
--------------------------------------------------------------------------------
/build/matrix.cfg:
--------------------------------------------------------------------------------
1 | # This is the full build with all files: this includes the vector-related files
2 | # like Renderers and Formats.
3 |
4 | [first]
5 | osmatrix.js
6 | event.js
7 | permalink.js
8 | geolocator.js
9 | geocoder.js
10 | map.js
11 | ui.js
12 | control.js
13 |
14 | [last]
15 |
16 | [include]
17 |
18 | [exclude]
19 | lib/d3.v3.min.js
20 | lib/leaflet-0.5.1.js
21 |
--------------------------------------------------------------------------------
/build/osmatrix.min.js:
--------------------------------------------------------------------------------
1 | var OSMatrix=(function(w){"use strict";var $=w.jQuery,PROXY_URL="/cgi-bin/proxy.cgi?url=",API_URL="http://lemberg.geog.uni-heidelberg.de:50684/osmatrix/",MODE={timestamp:1,diff:2};function Osmatrix(){}
2 | function get(url,callback){$.getJSON(PROXY_URL+encodeURIComponent(url),null,callback);}
3 | function getCapabilities(callback){get(API_URL+'api',callback);}
4 | function getLegend(mode,layer,callback){get(API_URL+'map/'+layer+'/'+mode+'/legend',callback);}
5 | function getLayerUrl(mode,layer,times){if(MODE[mode]===MODE.timestamp){return API_URL+'map/'+layer+'/timestamp/'+times[0]+'/{z}/{x}/{y}';}else{return API_URL+'map/'+layer+'/diff/{z}/{x}/{y}?start='+times[0]+'&end='+times[1];}}
6 | function getFeatureInfoFromPoint(attribute,latlng,callback){get(API_URL+'api/attributes/'+attribute+'?proj=4326&lat='+latlng.lat+'&lon='+latlng.lng,callback);}
7 | Osmatrix.prototype.getCapabilities=getCapabilities;Osmatrix.prototype.getLegend=getLegend;Osmatrix.prototype.getLayerUrl=getLayerUrl;Osmatrix.prototype.getFeatureInfoFromPoint=getFeatureInfoFromPoint;return new Osmatrix();}(window));var EventEmitter=(function(){"use strict";function eventEmitter(){this.events={};}
8 | function register(ev,callback){if(!this.events[ev]){this.events[ev]=[];}
9 | this.events[ev].push(callback);}
10 | function emit(ev,eventObj){if(this.events[ev]){for(var i=0,len=this.events[ev].length;i button').not('#'+tool+' > button').removeClass('active');$('.tool > .content').not('#'+tool+' > .content').removeClass('active');$('#sidebar').removeClass('active');$('#'+tool).toggleClass('active');$('#'+tool+' > button').toggleClass('active');$('#'+tool+' > .content').toggleClass('active');if($('#'+tool).parent().attr('id')==='sidebar'&&$('#'+tool+' > button').hasClass('active')){$('#sidebar').addClass('active');}}
40 | function handleButtonClick(e){var toolId=$(e.currentTarget).parent().attr('id');if(toolId===TOOLS.geolocate){setLoadingState(true,TOOLS.geolocate);theInterface.emit('ui:geolocationRequest');}else{toggleActiveState(toolId);}}
41 | function hideMessage(){$('#'+TOOLS.message).hide();}
42 | function displayMessage(type,text){$('#'+TOOLS.message).removeClass().addClass(type);$('#'+TOOLS.message+' h3').text(type.charAt(0).toUpperCase()+type.slice(1));$('#'+TOOLS.message+' p').text(text);$('#'+TOOLS.message+' > #actions > button').click(hideMessage);$('#'+TOOLS.message).show();}
43 | function stopGeolocation(text){setLoadingState(false,TOOLS.geolocate);if(text){displayMessage('error',text);}}
44 | function deactivateGeolocation(text){stopGeolocation();$('#'+TOOLS.geolocate).hide();if(text){displayMessage('error',text);}}
45 | function handleFormType(e){var key=e.which||e.keyCode;if(key===13){setLoadingState(true,TOOLS.geocode);theInterface.emit('ui:geocodeRequest',$(e.currentTarget).val());return false;}}
46 | function handleGeocodeLinkClick(e){theInterface.emit('ui:geocodeLinkClick',$(e.currentTarget).attr('href'));if($('#'+TOOLS.geocode+' > button').hasClass('active')){$('#'+TOOLS.geocode+' > button').click();}
47 | return false;}
48 | function updateGeocodeResultList(permaLink,results){var queryParams=permaLink.split('?')[1],linkBase=((permaLink.indexOf('?')!==-1)?permaLink.substring(0,permaLink.indexOf('?')):permaLink.substring(0)).split('#')[0],mapState=((permaLink.indexOf('?')!==-1)?permaLink.substring(0,permaLink.indexOf('?')):permaLink.substring(0)).split('#')[1].split('/');if(results){$('#'+TOOLS.geocode+' ul.resultList').children().remove();if(results.length>0){for(var i=0,len=results.length;i'+address.display_name+'');}}else{$('#'+TOOLS.geocode+' ul.resultList').append('
No results matching your query have been found.
');}
49 | $('#'+TOOLS.geocode+' ul.resultList li a').click(handleGeocodeLinkClick);}else{}
50 | setLoadingState(false,TOOLS.geocode);}
51 | function handleLayerModeToogle(e){$(e.currentTarget).siblings().removeClass('btn-success active');$(e.currentTarget).addClass('btn-success active');var timeElements=$('#'+TOOLS.layer+' input[name="timestamp"]');for(var i=0,len=timeElements.length;i2)||mode==='timestamp'){for(var i=0,len=timeElements.length;i'+c.attributes[i].title+'');}
54 | for(var i=0,len=c.timestamps.length;i'+c.timestamps[i].timestamp+'');}
55 | $('#'+TOOLS.layer+' input[name="timestamp"]').change(handleTimeStampChange);}
56 | function setLayerSwitcherToMode(state){if(state){$('#'+TOOLS.layer+' .btn-group button[value="'+state.mode+'"]').click();$('#'+TOOLS.layer+' #characteristics').val(state.layer);var times=$('#'+TOOLS.layer+' input[name="timestamp"]');for(var i=0,len=times.length;i button').hasClass('active')){$('#'+TOOLS.layer+' > button').click();}
61 | return false;}
62 | function setLayerLoadingState(state){setLoadingState(state,TOOLS.layer);}
63 | function updateLegend(l){$('#toolbox > h2').text(l.attribute.title);$('#'+TOOLS.legend+' .content #labels').children().remove();$('#'+TOOLS.legend+' .content h3').text(l.attribute.title);$('#'+TOOLS.legend+' .content p.desc').text(l.attribute.description);for(var i=0,len=l.labels.length;i'+l.labels[i].label+'');}}
64 | function updateFeatureInfo(info,colors){$('#'+TOOLS.featureInfo+' #chart').empty();if(info&&colors){$('#'+TOOLS.featureInfo+' h3').text(info.attribute.title);$('#'+TOOLS.featureInfo+' p').text(info.attribute.description);var chartArea,WIDTH=$('#'+TOOLS.featureInfo+' #chart').width(),HEIGHT=$('#'+TOOLS.featureInfo+' #chart').height(),MARGIN_TOP=10,MARGIN_LEFT=60,MARGIN_BOTTOM=60,min,max,xScale,yScale,xDomain=[],line=d3.svg.line().x(function(d){return xScale(d.timestamp);}).y(function(d){return yScale(d.value);}).interpolate("linear"),stddevArea=d3.svg.area().x(function(d){return xScale(d.timestamp);}).y0(function(d){return yScale(d.lower);}).y1(function(d){return yScale(d.upper);}),averages=[],stddev=[];for(var key in info.stats){min=d3.min([info.stats[key].min,min]);max=d3.max([info.stats[key].max,max]);}
65 | if(info.attribute==='DateOfLatestEdit'||info.attribute==='dateOfEldestEdit'){MARGIN_LEFT+=20;}
66 | else{min=0;}
67 | for(var i=0,len=info.timestamps.length;i .content').hasClass('active')){$('#'+TOOLS.featureInfo+' button').click();}}else{$('#'+TOOLS.featureInfo+' h3').text('');$('#'+TOOLS.featureInfo+' p').text('Click on the map to get information on the temporal evolution of the selected characteristic in the area of interest.');}
72 | setLoadingState(false,TOOLS.featureInfo);}
73 | function setFeatureInfoLoadingState(state){setLoadingState(state,TOOLS.featureInfo);}
74 | function Ui(){$('.tool > button').click(handleButtonClick);$('#'+TOOLS.layer+' .btn-group button').click(handleLayerModeToogle);$('#'+TOOLS.geocode+' input[type="text"]').keypress(handleFormType);$('#'+TOOLS.layer+' form').submit(handleLayerSubmit);hideMessage();}
75 | Ui.prototype=new EventEmitter();Ui.prototype.constructor=Ui;Ui.prototype.updateGeocodeResultList=updateGeocodeResultList;Ui.prototype.initializeLayerSwitcher=initializeLayerSwitcher;Ui.prototype.setLayerSwitcherToMode=setLayerSwitcherToMode;Ui.prototype.stopGeolocation=stopGeolocation;Ui.prototype.deactivateGeolocation=deactivateGeolocation;Ui.prototype.updateLegend=updateLegend;Ui.prototype.updateFeatureInfo=updateFeatureInfo;Ui.prototype.setLayerLoadingState=setLayerLoadingState;Ui.prototype.setFeatureInfoLoadingState=setFeatureInfoLoadingState;theInterface=new Ui();return theInterface;}(window));var Controller=(function(w){'use strict';var $=w.jQuery,ui=w.Ui,perma=w.Permalink,geolocator=w.Geolocator,geocoder=w.Geocoder,osmatrix=w.OSMatrix,Map=w.Map,HIGHLIGHT_COLORS=['#E41A1C','#377EB8','#4DAF4A','#984EA3','#FF7F00','#FFFF33','#A65628'],map;function handleGeolocateSuccess(position){map.moveTo([position.coords.latitude,position.coords.longitude]);ui.stopGeolocation();}
76 | function handleGeolocateError(error){switch(error.code){case error.UNKNOWN_ERROR:ui.stopGeolocation('The location acquisition process failed');break;case error.PERMISSION_DENIED:ui.deactivateGeolocation();break;case error.POSITION_UNAVAILABLE:ui.stopGeolocation('The position of the device could not be determined. One or more of the location providers used in the location acquisition process reported an internal error that caused the process to fail entirely.');break;case error.TIMEOUT:ui.stopGeolocation('The location acquisition timed out');break;}}
77 | function handleGeolocateNoSupport(){ui.deactivateGeolocation('Geolocation API is not supported by your browser.');}
78 | function handleGeocodeResults(results){ui.updateGeocodeResultList(w.document.URL,results);}
79 | function handleGeolocationRequest(){geolocator.locate(handleGeolocateSuccess,handleGeolocateError,handleGeolocateNoSupport);}
80 | function handleGeocodeRequest(address){geocoder.find(address,handleGeocodeResults);}
81 | function handleGeocodeLink(link){var permaLinkState=perma.parse(link);map.moveTo([permaLinkState.lat,permaLinkState.lng]);}
82 | function handleLayerUpdate(layerInfo){osmatrix.getLegend(layerInfo.mode,layerInfo.layer,handleLegend);map.updateMatrixLayer(layerInfo,osmatrix.getLayerUrl(layerInfo.mode,layerInfo.layer,layerInfo.times));ui.updateFeatureInfo();}
83 | function handleMapLoadStart(){ui.setLayerLoadingState(true);}
84 | function handleMapLoadEnd(){ui.setLayerLoadingState(false);}
85 | function handleMapChanged(mapState){perma.update(mapState.mode,mapState.layer,mapState.times,mapState.zoom,mapState.lon,mapState.lat);}
86 | function handleUserMapClick(latlng){ui.setFeatureInfoLoadingState(true);var layer=perma.parse(w.document.URL).layer;osmatrix.getFeatureInfoFromPoint(layer,latlng,handleFeatureInfoResult);}
87 | function handleMatrixCapabilities(capabilities){ui.initializeLayerSwitcher(capabilities);initializeTheMap();}
88 | function handleLegend(results){ui.updateLegend(results);}
89 | function initializeTheMatrix(){osmatrix.getCapabilities(handleMatrixCapabilities);}
90 | function initializeTheMap(){var permaLink=perma.parse(w.document.URL);if(permaLink){map.moveTo([permaLink.lat,permaLink.lng],permaLink.zoom);}else{handleGeolocationRequest();}
91 | ui.setLayerSwitcherToMode(permaLink);}
92 | function handleFeatureInfoResult(result){map.updateFeatureInfoLayer(result,HIGHLIGHT_COLORS);ui.updateFeatureInfo(result,HIGHLIGHT_COLORS);}
93 | function initialize(){map=new Map('map');map.register('layer:loadStart',handleMapLoadStart);map.register('layer:loadEnd',handleMapLoadEnd);map.register('map:changed',handleMapChanged);map.register('user:click',handleUserMapClick);ui.register('ui:geolocationRequest',handleGeolocationRequest);ui.register('ui:geocodeRequest',handleGeocodeRequest);ui.register('ui:geocodeLinkClick',handleGeocodeLink);ui.register('ui:layerUpdate',handleLayerUpdate);initializeTheMatrix();}
94 | function Controller(){}
95 | Controller.prototype.initialize=initialize;return new Controller();}(window));window.onload=Controller.initialize;
--------------------------------------------------------------------------------
/build/tools/README.txt:
--------------------------------------------------------------------------------
1 | This directory contains tools used in the packaging or deployment of OpenLayers.
2 |
3 | Javascript minimizing tools:
4 |
5 | * jsmin.c, jsmin.py:
6 | jsmin.py is a direct translation of the jsmin.c code into Python. jsmin.py
7 | will therefore run anyplace Python runs... but at significantly slower speed.
8 |
9 | * shrinksafe.py
10 | shrinksafe.py calls out to a third party javascript shrinking service. This
11 | creates file sizes about 4% smaller (as of commit 501) of the OpenLayers
12 | code. However, this also has the side effect of making you dependant on the
13 | web service -- and since that service sometimes goes dead, it's risky to
14 | depend on it.
15 |
--------------------------------------------------------------------------------
/build/tools/exampleparser.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | import sys
4 | import os
5 | import re
6 | import urllib2
7 | import time
8 | from xml.dom.minidom import Document
9 |
10 | try:
11 | import xml.etree.ElementTree as ElementTree
12 | except ImportError:
13 | try:
14 | import cElementTree as ElementTree
15 | except ImportError:
16 | try:
17 | import elementtree.ElementTree as ElementTree
18 | except ImportError:
19 | import lxml.etree as ElementTree
20 |
21 | missing_deps = False
22 | try:
23 | import simplejson
24 | from BeautifulSoup import BeautifulSoup
25 | except ImportError, E:
26 | missing_deps = E
27 |
28 | feedName = "example-list.xml"
29 | feedPath = "http://openlayers.org/dev/examples/"
30 |
31 | def getListOfOnlineExamples(baseUrl):
32 | """
33 | useful if you want to get a list of examples a url. not used by default.
34 | """
35 | html = urllib2.urlopen(baseUrl)
36 | soup = BeautifulSoup(html)
37 | examples = soup.findAll('li')
38 | examples = [example.find('a').get('href') for example in examples]
39 | examples = [example for example in examples if example.endswith('.html')]
40 | examples = [example for example in examples]
41 | return examples
42 |
43 | def getListOfExamples(relPath):
44 | """
45 | returns list of .html filenames within a given path - excludes example-list.html
46 | """
47 | examples = os.listdir(relPath)
48 | examples = [example for example in examples if example.endswith('.html') and example != "example-list.html"]
49 | return examples
50 |
51 |
52 | def getExampleHtml(location):
53 | """
54 | returns html of a specific example that is available online or locally
55 | """
56 | print '.',
57 | if location.startswith('http'):
58 | return urllib2.urlopen(location).read()
59 | else:
60 | f = open(location)
61 | html = f.read()
62 | f.close()
63 | return html
64 |
65 |
66 | def extractById(soup, tagId, value=None):
67 | """
68 | returns full contents of a particular tag id
69 | """
70 | beautifulTag = soup.find(id=tagId)
71 | if beautifulTag:
72 | if beautifulTag.contents:
73 | value = str(beautifulTag.renderContents()).strip()
74 | value = value.replace('\t','')
75 | value = value.replace('\n','')
76 | return value
77 |
78 | def getRelatedClasses(html):
79 | """
80 | parses the html, and returns a list of all OpenLayers Classes
81 | used within (ie what parts of OL the javascript uses).
82 | """
83 | rawstr = r'''(?POpenLayers\..*?)\('''
84 | return re.findall(rawstr, html)
85 |
86 | def parseHtml(html,ids):
87 | """
88 | returns dictionary of items of interest
89 | """
90 | soup = BeautifulSoup(html)
91 | d = {}
92 | for tagId in ids:
93 | d[tagId] = extractById(soup,tagId)
94 | #classes should eventually be parsed from docs - not automatically created.
95 | classes = getRelatedClasses(html)
96 | d['classes'] = classes
97 | return d
98 |
99 | def getSvnInfo(path):
100 | h = os.popen("svn info %s --xml" % path)
101 | tree = ElementTree.fromstring(h.read())
102 | h.close()
103 | d = {
104 | 'url': tree.findtext('entry/url'),
105 | 'author': tree.findtext('entry/commit/author'),
106 | 'date': tree.findtext('entry/commit/date')
107 | }
108 | return d
109 |
110 | def createFeed(examples):
111 | doc = Document()
112 | atomuri = "http://www.w3.org/2005/Atom"
113 | feed = doc.createElementNS(atomuri, "feed")
114 | feed.setAttribute("xmlns", atomuri)
115 | title = doc.createElementNS(atomuri, "title")
116 | title.appendChild(doc.createTextNode("OpenLayers Examples"))
117 | feed.appendChild(title)
118 | link = doc.createElementNS(atomuri, "link")
119 | link.setAttribute("rel", "self")
120 | link.setAttribute("href", feedPath + feedName)
121 |
122 | modtime = time.strftime("%Y-%m-%dT%I:%M:%SZ", time.gmtime())
123 | id = doc.createElementNS(atomuri, "id")
124 | id.appendChild(doc.createTextNode("%s%s#%s" % (feedPath, feedName, modtime)))
125 | feed.appendChild(id)
126 |
127 | updated = doc.createElementNS(atomuri, "updated")
128 | updated.appendChild(doc.createTextNode(modtime))
129 | feed.appendChild(updated)
130 |
131 | examples.sort(key=lambda x:x["modified"])
132 | for example in sorted(examples, key=lambda x:x["modified"], reverse=True):
133 | entry = doc.createElementNS(atomuri, "entry")
134 |
135 | title = doc.createElementNS(atomuri, "title")
136 | title.appendChild(doc.createTextNode(example["title"] or example["example"]))
137 | entry.appendChild(title)
138 |
139 | link = doc.createElementNS(atomuri, "link")
140 | link.setAttribute("href", "%s%s" % (feedPath, example["example"]))
141 | entry.appendChild(link)
142 |
143 | summary = doc.createElementNS(atomuri, "summary")
144 | summary.appendChild(doc.createTextNode(example["shortdesc"] or example["example"]))
145 | entry.appendChild(summary)
146 |
147 | updated = doc.createElementNS(atomuri, "updated")
148 | updated.appendChild(doc.createTextNode(example["modified"]))
149 | entry.appendChild(updated)
150 |
151 | author = doc.createElementNS(atomuri, "author")
152 | name = doc.createElementNS(atomuri, "name")
153 | name.appendChild(doc.createTextNode(example["author"]))
154 | author.appendChild(name)
155 | entry.appendChild(author)
156 |
157 | id = doc.createElementNS(atomuri, "id")
158 | id.appendChild(doc.createTextNode("%s%s#%s" % (feedPath, example["example"], example["modified"])))
159 | entry.appendChild(id)
160 |
161 | feed.appendChild(entry)
162 |
163 | doc.appendChild(feed)
164 | return doc
165 |
166 | def wordIndex(examples):
167 | """
168 | Create an inverted index based on words in title and shortdesc. Keys are
169 | lower cased words. Values are dictionaries with example index keys and
170 | count values.
171 | """
172 | index = {}
173 | unword = re.compile("\\W+")
174 | keys = ["shortdesc", "title"]
175 | for i in range(len(examples)):
176 | for key in keys:
177 | text = examples[i][key]
178 | if text:
179 | words = unword.split(text)
180 | for word in words:
181 | if word:
182 | word = word.lower()
183 | if index.has_key(word):
184 | if index[word].has_key(i):
185 | index[word][i] += 1
186 | else:
187 | index[word][i] = 1
188 | else:
189 | index[word] = {i: 1}
190 | return index
191 |
192 | if __name__ == "__main__":
193 |
194 | if missing_deps:
195 | print "This script requires simplejson and BeautifulSoup. You don't have them. \n(%s)" % E
196 | sys.exit()
197 |
198 | if len(sys.argv) > 1:
199 | outFile = open(sys.argv[1],'w')
200 | else:
201 | outFile = open('../examples/example-list.js','w')
202 |
203 | examplesLocation = '../examples'
204 | print 'Reading examples from %s and writing out to %s' % (examplesLocation, outFile.name)
205 |
206 | exampleList = []
207 | docIds = ['title','shortdesc']
208 |
209 | #comment out option to create docs from online resource
210 | #examplesLocation = 'http://svn.openlayers.org/sandbox/docs/examples/'
211 | #examples = getListOfOnlineExamples(examplesLocation)
212 |
213 | examples = getListOfExamples(examplesLocation)
214 |
215 | modtime = time.strftime("%Y-%m-%dT%I:%M:%SZ", time.gmtime())
216 |
217 | for example in examples:
218 | url = os.path.join(examplesLocation,example)
219 | html = getExampleHtml(url)
220 | tagvalues = parseHtml(html,docIds)
221 | tagvalues['example'] = example
222 | # add in svn info
223 | d = getSvnInfo(url)
224 | tagvalues["modified"] = d["date"] or modtime
225 | tagvalues["author"] = d["author"] or "anonymous"
226 | tagvalues['link'] = example
227 |
228 | exampleList.append(tagvalues)
229 |
230 | print
231 |
232 | exampleList.sort(key=lambda x:x['example'].lower())
233 |
234 | index = wordIndex(exampleList)
235 |
236 | json = simplejson.dumps({"examples": exampleList, "index": index})
237 | #give the json a global variable we can use in our js. This should be replaced or made optional.
238 | json = 'var info=' + json
239 | outFile.write(json)
240 | outFile.close()
241 |
242 | print "writing feed to ../examples/%s " % feedName
243 | atom = open('../examples/%s' % feedName, 'w')
244 | doc = createFeed(exampleList)
245 | atom.write(doc.toxml())
246 | atom.close()
247 |
248 |
249 | print 'complete'
250 |
251 |
252 |
--------------------------------------------------------------------------------
/build/tools/jsmin.c:
--------------------------------------------------------------------------------
1 | /* jsmin.c
2 | 2006-05-04
3 |
4 | Copyright (c) 2002 Douglas Crockford (www.crockford.com)
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy of
7 | this software and associated documentation files (the "Software"), to deal in
8 | the Software without restriction, including without limitation the rights to
9 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
10 | of the Software, and to permit persons to whom the Software is furnished to do
11 | so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | The Software shall be used for Good, not Evil.
17 |
18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 | SOFTWARE.
25 | */
26 |
27 | #include
28 | #include
29 |
30 | static int theA;
31 | static int theB;
32 | static int theLookahead = EOF;
33 |
34 |
35 | /* isAlphanum -- return true if the character is a letter, digit, underscore,
36 | dollar sign, or non-ASCII character.
37 | */
38 |
39 | static int
40 | isAlphanum(int c)
41 | {
42 | return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
43 | (c >= 'A' && c <= 'Z') || c == '_' || c == '$' || c == '\\' ||
44 | c > 126);
45 | }
46 |
47 |
48 | /* get -- return the next character from stdin. Watch out for lookahead. If
49 | the character is a control character, translate it to a space or
50 | linefeed.
51 | */
52 |
53 | static int
54 | get()
55 | {
56 | int c = theLookahead;
57 | theLookahead = EOF;
58 | if (c == EOF) {
59 | c = getc(stdin);
60 | }
61 | if (c >= ' ' || c == '\n' || c == EOF) {
62 | return c;
63 | }
64 | if (c == '\r') {
65 | return '\n';
66 | }
67 | return ' ';
68 | }
69 |
70 |
71 | /* peek -- get the next character without getting it.
72 | */
73 |
74 | static int
75 | peek()
76 | {
77 | theLookahead = get();
78 | return theLookahead;
79 | }
80 |
81 |
82 | /* next -- get the next character, excluding comments. peek() is used to see
83 | if a '/' is followed by a '/' or '*'.
84 | */
85 |
86 | static int
87 | next()
88 | {
89 | int c = get();
90 | if (c == '/') {
91 | switch (peek()) {
92 | case '/':
93 | for (;;) {
94 | c = get();
95 | if (c <= '\n') {
96 | return c;
97 | }
98 | }
99 | case '*':
100 | get();
101 | for (;;) {
102 | switch (get()) {
103 | case '*':
104 | if (peek() == '/') {
105 | get();
106 | return ' ';
107 | }
108 | break;
109 | case EOF:
110 | fprintf(stderr, "Error: JSMIN Unterminated comment.\n");
111 | exit(1);
112 | }
113 | }
114 | default:
115 | return c;
116 | }
117 | }
118 | return c;
119 | }
120 |
121 |
122 | /* action -- do something! What you do is determined by the argument:
123 | 1 Output A. Copy B to A. Get the next B.
124 | 2 Copy B to A. Get the next B. (Delete A).
125 | 3 Get the next B. (Delete B).
126 | action treats a string as a single character. Wow!
127 | action recognizes a regular expression if it is preceded by ( or , or =.
128 | */
129 |
130 | static void
131 | action(int d)
132 | {
133 | switch (d) {
134 | case 1:
135 | putc(theA, stdout);
136 | case 2:
137 | theA = theB;
138 | if (theA == '\'' || theA == '"') {
139 | for (;;) {
140 | putc(theA, stdout);
141 | theA = get();
142 | if (theA == theB) {
143 | break;
144 | }
145 | if (theA <= '\n') {
146 | fprintf(stderr,
147 | "Error: JSMIN unterminated string literal: %c\n", theA);
148 | exit(1);
149 | }
150 | if (theA == '\\') {
151 | putc(theA, stdout);
152 | theA = get();
153 | }
154 | }
155 | }
156 | case 3:
157 | theB = next();
158 | if (theB == '/' && (theA == '(' || theA == ',' || theA == '=' ||
159 | theA == ':' || theA == '[' || theA == '!' || theA == '&' ||
160 | theA == '|')) {
161 | putc(theA, stdout);
162 | putc(theB, stdout);
163 | for (;;) {
164 | theA = get();
165 | if (theA == '/') {
166 | break;
167 | } else if (theA =='\\') {
168 | putc(theA, stdout);
169 | theA = get();
170 | } else if (theA <= '\n') {
171 | fprintf(stderr,
172 | "Error: JSMIN unterminated Regular Expression literal.\n", theA);
173 | exit(1);
174 | }
175 | putc(theA, stdout);
176 | }
177 | theB = next();
178 | }
179 | }
180 | }
181 |
182 |
183 | /* jsmin -- Copy the input to the output, deleting the characters which are
184 | insignificant to JavaScript. Comments will be removed. Tabs will be
185 | replaced with spaces. Carriage returns will be replaced with linefeeds.
186 | Most spaces and linefeeds will be removed.
187 | */
188 |
189 | static void
190 | jsmin()
191 | {
192 | theA = '\n';
193 | action(3);
194 | while (theA != EOF) {
195 | switch (theA) {
196 | case ' ':
197 | if (isAlphanum(theB)) {
198 | action(1);
199 | } else {
200 | action(2);
201 | }
202 | break;
203 | case '\n':
204 | switch (theB) {
205 | case '{':
206 | case '[':
207 | case '(':
208 | case '+':
209 | case '-':
210 | action(1);
211 | break;
212 | case ' ':
213 | action(3);
214 | break;
215 | default:
216 | if (isAlphanum(theB)) {
217 | action(1);
218 | } else {
219 | action(2);
220 | }
221 | }
222 | break;
223 | default:
224 | switch (theB) {
225 | case ' ':
226 | if (isAlphanum(theA)) {
227 | action(1);
228 | break;
229 | }
230 | action(3);
231 | break;
232 | case '\n':
233 | switch (theA) {
234 | case '}':
235 | case ']':
236 | case ')':
237 | case '+':
238 | case '-':
239 | case '"':
240 | case '\'':
241 | action(1);
242 | break;
243 | default:
244 | if (isAlphanum(theA)) {
245 | action(1);
246 | } else {
247 | action(3);
248 | }
249 | }
250 | break;
251 | default:
252 | action(1);
253 | break;
254 | }
255 | }
256 | }
257 | }
258 |
259 |
260 | /* main -- Output any command line arguments as comments
261 | and then minify the input.
262 | */
263 | extern int
264 | main(int argc, char* argv[])
265 | {
266 | int i;
267 | for (i = 1; i < argc; i += 1) {
268 | fprintf(stdout, "// %s\n", argv[i]);
269 | }
270 | jsmin();
271 | return 0;
272 | }
273 |
--------------------------------------------------------------------------------
/build/tools/jsmin.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 |
3 | # This code is original from jsmin by Douglas Crockford, it was translated to
4 | # Python by Baruch Even. The original code had the following copyright and
5 | # license.
6 | #
7 | # /* jsmin.c
8 | # 2007-01-08
9 | #
10 | # Copyright (c) 2002 Douglas Crockford (www.crockford.com)
11 | #
12 | # Permission is hereby granted, free of charge, to any person obtaining a copy of
13 | # this software and associated documentation files (the "Software"), to deal in
14 | # the Software without restriction, including without limitation the rights to
15 | # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
16 | # of the Software, and to permit persons to whom the Software is furnished to do
17 | # so, subject to the following conditions:
18 | #
19 | # The above copyright notice and this permission notice shall be included in all
20 | # copies or substantial portions of the Software.
21 | #
22 | # The Software shall be used for Good, not Evil.
23 | #
24 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 | # SOFTWARE.
31 | # */
32 |
33 | from StringIO import StringIO
34 |
35 | def jsmin(js):
36 | ins = StringIO(js)
37 | outs = StringIO()
38 | JavascriptMinify().minify(ins, outs)
39 | str = outs.getvalue()
40 | if len(str) > 0 and str[0] == '\n':
41 | str = str[1:]
42 | return str
43 |
44 | def isAlphanum(c):
45 | """return true if the character is a letter, digit, underscore,
46 | dollar sign, or non-ASCII character.
47 | """
48 | return ((c >= 'a' and c <= 'z') or (c >= '0' and c <= '9') or
49 | (c >= 'A' and c <= 'Z') or c == '_' or c == '$' or c == '\\' or (c is not None and ord(c) > 126));
50 |
51 | class UnterminatedComment(Exception):
52 | pass
53 |
54 | class UnterminatedStringLiteral(Exception):
55 | pass
56 |
57 | class UnterminatedRegularExpression(Exception):
58 | pass
59 |
60 | class JavascriptMinify(object):
61 |
62 | def _outA(self):
63 | self.outstream.write(self.theA)
64 | def _outB(self):
65 | self.outstream.write(self.theB)
66 |
67 | def _get(self):
68 | """return the next character from stdin. Watch out for lookahead. If
69 | the character is a control character, translate it to a space or
70 | linefeed.
71 | """
72 | c = self.theLookahead
73 | self.theLookahead = None
74 | if c == None:
75 | c = self.instream.read(1)
76 | if c >= ' ' or c == '\n':
77 | return c
78 | if c == '': # EOF
79 | return '\000'
80 | if c == '\r':
81 | return '\n'
82 | return ' '
83 |
84 | def _peek(self):
85 | self.theLookahead = self._get()
86 | return self.theLookahead
87 |
88 | def _next(self):
89 | """get the next character, excluding comments. peek() is used to see
90 | if a '/' is followed by a '/' or '*'.
91 | """
92 | c = self._get()
93 | if c == '/':
94 | p = self._peek()
95 | if p == '/':
96 | c = self._get()
97 | while c > '\n':
98 | c = self._get()
99 | return c
100 | if p == '*':
101 | c = self._get()
102 | while 1:
103 | c = self._get()
104 | if c == '*':
105 | if self._peek() == '/':
106 | self._get()
107 | return ' '
108 | if c == '\000':
109 | raise UnterminatedComment()
110 |
111 | return c
112 |
113 | def _action(self, action):
114 | """do something! What you do is determined by the argument:
115 | 1 Output A. Copy B to A. Get the next B.
116 | 2 Copy B to A. Get the next B. (Delete A).
117 | 3 Get the next B. (Delete B).
118 | action treats a string as a single character. Wow!
119 | action recognizes a regular expression if it is preceded by ( or , or =.
120 | """
121 | if action <= 1:
122 | self._outA()
123 |
124 | if action <= 2:
125 | self.theA = self.theB
126 | if self.theA == "'" or self.theA == '"':
127 | while 1:
128 | self._outA()
129 | self.theA = self._get()
130 | if self.theA == self.theB:
131 | break
132 | if self.theA <= '\n':
133 | raise UnterminatedStringLiteral()
134 | if self.theA == '\\':
135 | self._outA()
136 | self.theA = self._get()
137 |
138 |
139 | if action <= 3:
140 | self.theB = self._next()
141 | if self.theB == '/' and (self.theA == '(' or self.theA == ',' or
142 | self.theA == '=' or self.theA == ':' or
143 | self.theA == '[' or self.theA == '?' or
144 | self.theA == '!' or self.theA == '&' or
145 | self.theA == '|'):
146 | self._outA()
147 | self._outB()
148 | while 1:
149 | self.theA = self._get()
150 | if self.theA == '/':
151 | break
152 | elif self.theA == '\\':
153 | self._outA()
154 | self.theA = self._get()
155 | elif self.theA <= '\n':
156 | raise UnterminatedRegularExpression()
157 | self._outA()
158 | self.theB = self._next()
159 |
160 |
161 | def _jsmin(self):
162 | """Copy the input to the output, deleting the characters which are
163 | insignificant to JavaScript. Comments will be removed. Tabs will be
164 | replaced with spaces. Carriage returns will be replaced with linefeeds.
165 | Most spaces and linefeeds will be removed.
166 | """
167 | self.theA = '\n'
168 | self._action(3)
169 |
170 | while self.theA != '\000':
171 | if self.theA == ' ':
172 | if isAlphanum(self.theB):
173 | self._action(1)
174 | else:
175 | self._action(2)
176 | elif self.theA == '\n':
177 | if self.theB in ['{', '[', '(', '+', '-']:
178 | self._action(1)
179 | elif self.theB == ' ':
180 | self._action(3)
181 | else:
182 | if isAlphanum(self.theB):
183 | self._action(1)
184 | else:
185 | self._action(2)
186 | else:
187 | if self.theB == ' ':
188 | if isAlphanum(self.theA):
189 | self._action(1)
190 | else:
191 | self._action(3)
192 | elif self.theB == '\n':
193 | if self.theA in ['}', ']', ')', '+', '-', '"', '\'']:
194 | self._action(1)
195 | else:
196 | if isAlphanum(self.theA):
197 | self._action(1)
198 | else:
199 | self._action(3)
200 | else:
201 | self._action(1)
202 |
203 | def minify(self, instream, outstream):
204 | self.instream = instream
205 | self.outstream = outstream
206 | self.theA = None
207 | self.thaB = None
208 | self.theLookahead = None
209 |
210 | self._jsmin()
211 | self.instream.close()
212 |
213 | if __name__ == '__main__':
214 | import sys
215 | jsm = JavascriptMinify()
216 | jsm.minify(sys.stdin, sys.stdout)
217 |
--------------------------------------------------------------------------------
/build/tools/jsmin.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GIScience/osmatrix-client/39b564a91aa00de467128449977f322515cc5b4f/build/tools/jsmin.pyc
--------------------------------------------------------------------------------
/build/tools/mergejs.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | #
3 | # Merge multiple JavaScript source code files into one.
4 | #
5 | # Usage:
6 | # This script requires source files to have dependencies specified in them.
7 | #
8 | # Dependencies are specified with a comment of the form:
9 | #
10 | # // @requires
11 | #
12 | # e.g.
13 | #
14 | # // @requires Geo/DataSource.js
15 | #
16 | # This script should be executed like so:
17 | #
18 | # mergejs.py [...]
19 | #
20 | # e.g.
21 | #
22 | # mergejs.py openlayers.js Geo/ CrossBrowser/
23 | #
24 | # This example will cause the script to walk the `Geo` and
25 | # `CrossBrowser` directories--and subdirectories thereof--and import
26 | # all `*.js` files encountered. The dependency declarations will be extracted
27 | # and then the source code from imported files will be output to
28 | # a file named `openlayers.js` in an order which fulfils the dependencies
29 | # specified.
30 | #
31 | #
32 | # Note: This is a very rough initial version of this code.
33 | #
34 | # -- Copyright 2005-2010 OpenLayers contributors / OpenLayers project --
35 | #
36 |
37 | # TODO: Allow files to be excluded. e.g. `Crossbrowser/DebugMode.js`?
38 | # TODO: Report error when dependency can not be found rather than KeyError.
39 |
40 | import re
41 | import os
42 | import sys
43 |
44 | SUFFIX_JAVASCRIPT = ".js"
45 |
46 | RE_REQUIRE = "@requires:? (.*)\n" # TODO: Ensure in comment?
47 | class SourceFile:
48 | """
49 | Represents a Javascript source code file.
50 | """
51 |
52 | def __init__(self, filepath, source):
53 | """
54 | """
55 | self.filepath = filepath
56 | self.source = source
57 |
58 | self.requiredBy = []
59 |
60 |
61 | def _getRequirements(self):
62 | """
63 | Extracts the dependencies specified in the source code and returns
64 | a list of them.
65 | """
66 | # TODO: Cache?
67 | return re.findall(RE_REQUIRE, self.source)
68 |
69 | requires = property(fget=_getRequirements, doc="")
70 |
71 |
72 |
73 | def usage(filename):
74 | """
75 | Displays a usage message.
76 | """
77 | print "%s [-c ] [...]" % filename
78 |
79 |
80 | class Config:
81 | """
82 | Represents a parsed configuration file.
83 |
84 | A configuration file should be of the following form:
85 |
86 | [first]
87 | 3rd/prototype.js
88 | core/application.js
89 | core/params.js
90 | # A comment
91 |
92 | [last]
93 | core/api.js # Another comment
94 |
95 | [exclude]
96 | 3rd/logger.js
97 |
98 | All headings are required.
99 |
100 | The files listed in the `first` section will be forced to load
101 | *before* all other files (in the order listed). The files in `last`
102 | section will be forced to load *after* all the other files (in the
103 | order listed).
104 |
105 | The files list in the `exclude` section will not be imported.
106 |
107 | Any text appearing after a # symbol indicates a comment.
108 |
109 | """
110 |
111 | def __init__(self, filename):
112 | """
113 | Parses the content of the named file and stores the values.
114 | """
115 | lines = [re.sub("#.*?$", "", line).strip() # Assumes end-of-line character is present
116 | for line in open(filename)
117 | if line.strip() and not line.strip().startswith("#")] # Skip blank lines and comments
118 |
119 | self.forceFirst = lines[lines.index("[first]") + 1:lines.index("[last]")]
120 |
121 | self.forceLast = lines[lines.index("[last]") + 1:lines.index("[include]")]
122 | self.include = lines[lines.index("[include]") + 1:lines.index("[exclude]")]
123 | self.exclude = lines[lines.index("[exclude]") + 1:]
124 |
125 | def run (sourceDirectory, outputFilename = None, configFile = None):
126 | cfg = None
127 | if configFile:
128 | cfg = Config(configFile)
129 |
130 | allFiles = []
131 |
132 | ## Find all the Javascript source files
133 | for root, dirs, files in os.walk(sourceDirectory):
134 | for filename in files:
135 | if filename.endswith(SUFFIX_JAVASCRIPT) and not filename.startswith("."):
136 | filepath = os.path.join(root, filename)[len(sourceDirectory)+1:]
137 | filepath = filepath.replace("\\", "/")
138 | if cfg and cfg.include:
139 | if filepath in cfg.include or filepath in cfg.forceFirst:
140 | allFiles.append(filepath)
141 | elif (not cfg) or (filepath not in cfg.exclude):
142 | allFiles.append(filepath)
143 |
144 | ## Header inserted at the start of each file in the output
145 | HEADER = "/* " + "=" * 70 + "\n %s\n" + " " + "=" * 70 + " */\n\n"
146 |
147 | files = {}
148 |
149 | order = [] # List of filepaths to output, in a dependency satisfying order
150 |
151 | ## Import file source code
152 | ## TODO: Do import when we walk the directories above?
153 | for filepath in allFiles:
154 | print "Importing: %s" % filepath
155 | fullpath = os.path.join(sourceDirectory, filepath).strip()
156 | content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF?
157 | files[filepath] = SourceFile(filepath, content) # TODO: Chop path?
158 |
159 | print
160 |
161 | from toposort import toposort
162 |
163 | complete = False
164 | resolution_pass = 1
165 |
166 | while not complete:
167 | order = [] # List of filepaths to output, in a dependency satisfying order
168 | nodes = []
169 | routes = []
170 | ## Resolve the dependencies
171 | print "Resolution pass %s... " % resolution_pass
172 | resolution_pass += 1
173 |
174 | for filepath, info in files.items():
175 | nodes.append(filepath)
176 | for neededFilePath in info.requires:
177 | routes.append((neededFilePath, filepath))
178 |
179 | for dependencyLevel in toposort(nodes, routes):
180 | for filepath in dependencyLevel:
181 | order.append(filepath)
182 | if not files.has_key(filepath):
183 | print "Importing: %s" % filepath
184 | fullpath = os.path.join(sourceDirectory, filepath).strip()
185 | content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF?
186 | files[filepath] = SourceFile(filepath, content) # TODO: Chop path?
187 |
188 |
189 |
190 | # Double check all dependencies have been met
191 | complete = True
192 | try:
193 | for fp in order:
194 | if max([order.index(rfp) for rfp in files[fp].requires] +
195 | [order.index(fp)]) != order.index(fp):
196 | complete = False
197 | except:
198 | complete = False
199 |
200 | print
201 |
202 |
203 | ## Move forced first and last files to the required position
204 | if cfg:
205 | print "Re-ordering files..."
206 | order = cfg.forceFirst + [item
207 | for item in order
208 | if ((item not in cfg.forceFirst) and
209 | (item not in cfg.forceLast))] + cfg.forceLast
210 |
211 | print
212 | ## Output the files in the determined order
213 | result = []
214 |
215 | for fp in order:
216 | f = files[fp]
217 | print "Exporting: ", f.filepath
218 | result.append(HEADER % f.filepath)
219 | source = f.source
220 | result.append(source)
221 | if not source.endswith("\n"):
222 | result.append("\n")
223 |
224 | print "\nTotal files merged: %d " % len(files)
225 |
226 | if outputFilename:
227 | print "\nGenerating: %s" % (outputFilename)
228 | open(outputFilename, "w").write("".join(result))
229 | return "".join(result)
230 |
231 | if __name__ == "__main__":
232 | import getopt
233 |
234 | options, args = getopt.getopt(sys.argv[1:], "-c:")
235 |
236 | try:
237 | outputFilename = args[0]
238 | except IndexError:
239 | usage(sys.argv[0])
240 | raise SystemExit
241 | else:
242 | sourceDirectory = args[1]
243 | if not sourceDirectory:
244 | usage(sys.argv[0])
245 | raise SystemExit
246 |
247 | configFile = None
248 | if options and options[0][0] == "-c":
249 | configFile = options[0][1]
250 | print "Parsing configuration file: %s" % filename
251 |
252 | run( sourceDirectory, outputFilename, configFile )
253 |
--------------------------------------------------------------------------------
/build/tools/mergejs.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GIScience/osmatrix-client/39b564a91aa00de467128449977f322515cc5b4f/build/tools/mergejs.pyc
--------------------------------------------------------------------------------
/build/tools/minimize.py:
--------------------------------------------------------------------------------
1 | # Minimal Python Minimizer
2 | # Copyright 2008, Christopher Schmidt
3 | # Released under the MIT License
4 | #
5 | # Taken from: http://svn.crschmidt.net/personal/python/minimize.py
6 | # $Id: minimize.py 6 2008-01-03 06:33:35Z crschmidt $
7 | #
8 | # Permission is hereby granted, free of charge, to any person obtaining a copy
9 | # of this software and associated documentation files (the "Software"), to deal
10 | # in the Software without restriction, including without limitation the rights
11 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | # copies of the Software, and to permit persons to whom the Software is
13 | # furnished to do so, subject to the following conditions:
14 | #
15 | # The above copyright notice and this permission notice shall be included in
16 | # all copies or substantial portions of the Software.
17 | #
18 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | # THE SOFTWARE.
25 |
26 | import re
27 |
28 | def strip_comments_helper(data):
29 | """remove all /* */ format comments and surrounding whitespace."""
30 | p = re.compile(r'[\s]*/\*.*?\*/[\s]*', re.DOTALL)
31 | return p.sub('',data)
32 |
33 | def minimize(data, exclude=None):
34 | """Central function call. This will call all other compression
35 | functions. To add further compression algorithms, simply add
36 | functions whose names end in _helper which take a string as input
37 | and return a more compressed string as output."""
38 | for key, item in globals().iteritems():
39 | if key.endswith("_helper"):
40 | func_key = key[:-7]
41 | if not exclude or not func_key in exclude:
42 | data = item(data)
43 | return data
44 |
45 | if __name__ == "__main__":
46 | import sys
47 | print minimize(open(sys.argv[1]).read())
48 |
--------------------------------------------------------------------------------
/build/tools/oldot.py:
--------------------------------------------------------------------------------
1 | import re
2 | import os
3 | def run():
4 | sourceDirectory = "../lib/OpenLayers"
5 | allFiles = []
6 | SUFFIX_JAVASCRIPT = ".js"
7 | ## Find all the Javascript source files
8 | for root, dirs, files in os.walk(sourceDirectory):
9 | for filename in files:
10 | if filename.endswith(SUFFIX_JAVASCRIPT) and not filename.startswith("."):
11 | filepath = os.path.join(root, filename)[len(sourceDirectory)+1:]
12 | filepath = filepath.replace("\\", "/")
13 | data = open(os.path.join(sourceDirectory, filepath)).read()
14 | parents = re.search("OpenLayers.Class\((.*?){", data,
15 | re.DOTALL)
16 | if parents:
17 | parents = [x.strip() for x in parents.group(1).strip().strip(",").split(",")]
18 | else:
19 | parents = []
20 | cls = "OpenLayers.%s" % filepath.strip(".js").replace("/", ".")
21 | allFiles.append([cls, parents])
22 | return allFiles
23 | print """
24 | digraph name {
25 | fontname = "Helvetica"
26 | fontsize = 8
27 | K = 0.6
28 |
29 | node [
30 | fontname = "Helvetica"
31 | fontsize = 8
32 | shape = "plaintext"
33 | ]
34 | """
35 |
36 | for i in run():
37 | print i[0].replace(".", "_")
38 | for item in i[1]:
39 | if not item: continue
40 | print "%s -> %s" % (i[0].replace(".","_"), item.replace(".", "_"))
41 | print "; "
42 |
43 | print """}"""
44 |
--------------------------------------------------------------------------------
/build/tools/release.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | VERSION=$1
4 |
5 | svn export http://svn.openlayers.org/tags/openlayers/release-$VERSION OpenLayers-$VERSION
6 | cd OpenLayers-$VERSION/build
7 | ./build.py full
8 | cp OpenLayers.js ..
9 |
10 | cd ..
11 |
12 | mkdir doc/devdocs
13 | mkdir doc/apidocs
14 | rm tools/*.pyc
15 |
16 | mkdir /www/openlayers/htdocs/api/$VERSION
17 | cp OpenLayers.js /www/openlayers/htdocs/api/$VERSION
18 | cp -a img/ /www/openlayers/htdocs/api/$VERSION
19 | cp -a theme/ /www/openlayers/htdocs/api/$VERSION
20 |
21 | cd ..
22 |
23 | ~/nd/NaturalDocs -i OpenLayers-$VERSION/lib -o HTML OpenLayers-$VERSION/doc/devdocs -p OpenLayers-$VERSION/doc_config -s Small OL
24 | ~/nd/NaturalDocs -i OpenLayers-$VERSION/lib -o HTML OpenLayers-$VERSION/doc/apidocs -p OpenLayers-$VERSION/apidoc_config -s Small OL
25 |
26 | tar cvfz OpenLayers-$VERSION.tar.gz OpenLayers-$VERSION/
27 | zip -9r OpenLayers-$VERSION.zip OpenLayers-$VERSION/
28 |
29 | cp OpenLayers-$VERSION.* /www/openlayers/htdocs/download
30 |
--------------------------------------------------------------------------------
/build/tools/shrinksafe.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | #
3 | # Script to provide a wrapper around the ShrinkSafe "web service"
4 | #
5 | #
6 |
7 | #
8 | # We use this script for two reasons:
9 | #
10 | # * This avoids having to install and configure Java and the standalone
11 | # ShrinkSafe utility.
12 | #
13 | # * The current ShrinkSafe standalone utility was broken when we last
14 | # used it.
15 | #
16 |
17 | import sys
18 |
19 | import urllib
20 | import urllib2
21 |
22 | URL_SHRINK_SAFE = "http://shrinksafe.dojotoolkit.org/shrinksafe.php"
23 |
24 | # This would normally be dynamically generated:
25 | BOUNDARY_MARKER = "---------------------------72288400411964641492083565382"
26 |
27 | if __name__ == "__main__":
28 | ## Grab the source code
29 | try:
30 | sourceFilename = sys.argv[1]
31 | except:
32 | print "Usage: %s (|-)" % sys.argv[0]
33 | raise SystemExit
34 |
35 | if sourceFilename == "-":
36 | sourceCode = sys.stdin.read()
37 | sourceFilename = "stdin.js"
38 | else:
39 | sourceCode = open(sourceFilename).read()
40 |
41 | ## Create the request replicating posting of the form from the web page
42 | request = urllib2.Request(url=URL_SHRINK_SAFE)
43 | request.add_header("Content-Type",
44 | "multipart/form-data; boundary=%s" % BOUNDARY_MARKER)
45 | request.add_data("""
46 | --%s
47 | Content-Disposition: form-data; name="shrinkfile[]"; filename="%s"
48 | Content-Type: application/x-javascript
49 |
50 | %s
51 | """ % (BOUNDARY_MARKER, sourceFilename, sourceCode))
52 |
53 | ## Deliver the result
54 | print urllib2.urlopen(request).read(),
55 |
--------------------------------------------------------------------------------
/build/tools/toposort.py:
--------------------------------------------------------------------------------
1 | #
2 | # According to this file
3 | # is licensed under a BSD-style license. We only use the section
4 | # originally by Tim Peters.
5 | #
6 | # TODO: The use of this code needs to be okayed by someone.
7 | #
8 |
9 | class RecursionError( OverflowError, ValueError ):
10 | '''Unable to calculate result because of recursive structure'''
11 |
12 |
13 | def sort(nodes, routes, noRecursion=1):
14 | '''Passed a list of node IDs and a list of source,dest ID routes
15 | attempt to create a list of stages where each sub list
16 | is one stage in a process.
17 | '''
18 | children, parents = _buildChildrenLists(routes)
19 | # first stage is those nodes
20 | # having no incoming routes...
21 | stage = []
22 | stages = [stage]
23 | taken = []
24 | for node in nodes:
25 | if (not parents.get(node)):
26 | stage.append (node)
27 | if nodes and not stage:
28 | # there is no element which does not depend on
29 | # some other element!!!
30 | stage.append( nodes[0])
31 | taken.extend( stage )
32 | nodes = filter ( lambda x, l=stage: x not in l, nodes )
33 | while nodes:
34 | previousStageChildren = []
35 | nodelen = len(nodes)
36 | # second stage are those nodes
37 | # which are direct children of the first stage
38 | for node in stage:
39 | for child in children.get (node, []):
40 | if child not in previousStageChildren and child not in taken:
41 | previousStageChildren.append(child)
42 | elif child in taken and noRecursion:
43 | raise RecursionError( (child, node) )
44 | # unless they are children of other direct children...
45 | # TODO, actually do that...
46 | stage = previousStageChildren
47 | removes = []
48 | for current in stage:
49 | currentParents = parents.get( current, [] )
50 | for parent in currentParents:
51 | if parent in stage and parent != current:
52 | # might wind up removing current...
53 | if not current in parents.get(parent, []):
54 | # is not mutually dependent...
55 | removes.append( current )
56 | for remove in removes:
57 | while remove in stage:
58 | stage.remove( remove )
59 | stages.append( stage)
60 | taken.extend( stage )
61 | nodes = filter ( lambda x, l=stage: x not in l, nodes )
62 | if nodelen == len(nodes):
63 | if noRecursion:
64 | raise RecursionError( nodes )
65 | else:
66 | stages.append( nodes[:] )
67 | nodes = []
68 | return stages
69 |
70 | def _buildChildrenLists (routes):
71 | childrenTable = {}
72 | parentTable = {}
73 | for sourceID,destinationID in routes:
74 | currentChildren = childrenTable.get( sourceID, [])
75 | currentParents = parentTable.get( destinationID, [])
76 | if not destinationID in currentChildren:
77 | currentChildren.append ( destinationID)
78 | if not sourceID in currentParents:
79 | currentParents.append ( sourceID)
80 | childrenTable[sourceID] = currentChildren
81 | parentTable[destinationID] = currentParents
82 | return childrenTable, parentTable
83 |
84 |
85 | def toposort (nodes, routes, noRecursion=1):
86 | '''Topological sort from Tim Peters, fairly efficient
87 | in comparison (it seems).'''
88 | #first calculate the recursion depth
89 |
90 | dependencies = {}
91 | inversedependencies = {}
92 | if not nodes:
93 | return []
94 | if not routes:
95 | return [nodes]
96 | for node in nodes:
97 | dependencies[ node ] = (0, node)
98 | inversedependencies[ node ] = []
99 |
100 |
101 | for depended, depends in routes:
102 | # is it a null rule
103 | try:
104 | newdependencylevel, object = dependencies.get ( depends, (0, depends))
105 | except TypeError:
106 | print depends
107 | raise
108 | dependencies[ depends ] = (newdependencylevel + 1, depends)
109 | # "dependency (existence) of depended-on"
110 | newdependencylevel,object = dependencies.get ( depended, (0, depended) )
111 | dependencies[ depended ] = (newdependencylevel, depended)
112 | # Inverse dependency set up
113 | dependencieslist = inversedependencies.get ( depended, [])
114 | dependencieslist.append (depends)
115 | inversedependencies[depended] = dependencieslist
116 | ### Now we do the actual sorting
117 | # The first task is to create the sortable
118 | # list of dependency-levels
119 | sortinglist = dependencies.values()
120 | sortinglist.sort ()
121 | output = []
122 | while sortinglist:
123 | deletelist = []
124 | generation = []
125 | output.append( generation)
126 | while sortinglist and sortinglist[0][0] == 0:
127 | number, object = sortinglist[0]
128 | generation.append ( object )
129 | deletelist.append( object )
130 | for inverse in inversedependencies.get(object, () ):
131 | try:
132 | oldcount, inverse = dependencies [ inverse]
133 | if oldcount > 0:
134 | # will be dealt with on later pass
135 | dependencies [ inverse] = (oldcount-1, inverse)
136 | else:
137 | # will be dealt with on this pass,
138 | # so needs not to be in the sorting list next time
139 | deletelist.append( inverse )
140 | # just in case a loop comes through
141 | inversedependencies[object] = []
142 | except KeyError:
143 | # dealing with a recursion-breaking run...
144 | pass
145 | del sortinglist [0]
146 | # if no elements could be deleted, then
147 | # there is something which depends upon itself
148 | if not deletelist:
149 | if noRecursion:
150 | raise RecursionError( sortinglist )
151 | else:
152 | # hack so that something gets deleted...
153 | ## import pdb
154 | ## pdb.set_trace()
155 | dependencies[sortinglist[0][1]] = (0,sortinglist[0][1])
156 | # delete the items that were dealt with
157 | for item in deletelist:
158 | try:
159 | del dependencies [ item ]
160 | except KeyError:
161 | pass
162 | # need to recreate the sortinglist
163 | sortinglist = dependencies.values()
164 | if not generation:
165 | output.remove( generation )
166 | sortinglist.sort ()
167 | return output
168 |
169 |
170 |
171 |
172 |
173 | if __name__ == "__main__":
174 |
175 | nodes = ['a', 'b', 'c', 'd', 'e', 'f']
176 | route = [('a', 'b'), ('b', 'c'), ('b', 'd'), ('e','f')]
177 |
178 | for x in toposort( nodes, route):
179 | for a in x:
180 | print a
181 |
182 | raise SystemExit
183 |
184 |
185 |
186 | import pprint, traceback
187 | nodes= [ 0,1,2,3,4,5 ]
188 | testingValues = [
189 | [ (0,1),(1,2),(2,3),(3,4),(4,5)],
190 | [ (0,1),(0,2),(1,2),(3,4),(4,5)],
191 | [
192 | (0,1),
193 | (0,2),
194 | (0,2),
195 | (2,4),
196 | (2,5),
197 | (3,2),
198 | (0,3)],
199 | [
200 | (0,1), # 3-element cycle test, no orphan nodes
201 | (1,2),
202 | (2,0),
203 | (2,4),
204 | (2,5),
205 | (3,2),
206 | (0,3)],
207 | [
208 | (0,1),
209 | (1,1),
210 | (1,1),
211 | (1,4),
212 | (1,5),
213 | (1,2),
214 | (3,1),
215 | (2,1),
216 | (2,0)],
217 | [
218 | (0,1),
219 | (1,0),
220 | (0,2),
221 | (0,3),
222 | ],
223 | [
224 | (0,1),
225 | (1,0),
226 | (0,2),
227 | (3,1),
228 | ],
229 | ]
230 | print 'sort, no recursion allowed'
231 | for index in range(len(testingValues)):
232 | ## print ' %s -- %s'%( index, testingValues[index])
233 | try:
234 | print ' ', sort( nodes, testingValues[index] )
235 | except:
236 | print 'exception raised'
237 | print 'toposort, no recursion allowed'
238 | for index in range(len(testingValues)):
239 | ## print ' %s -- %s'%( index, testingValues[index])
240 | try:
241 | print ' ', toposort( nodes, testingValues[index] )
242 | except:
243 | print 'exception raised'
244 | print 'sort, recursion allowed'
245 | for index in range(len(testingValues)):
246 | ## print ' %s -- %s'%( index, testingValues[index])
247 | try:
248 | print ' ', sort( nodes, testingValues[index],0 )
249 | except:
250 | print 'exception raised'
251 | print 'toposort, recursion allowed'
252 | for index in range(len(testingValues)):
253 | ## print ' %s -- %s'%( index, testingValues[index])
254 | try:
255 | print ' ', toposort( nodes, testingValues[index],0 )
256 | except:
257 | print 'exception raised'
258 |
259 |
260 |
261 |
--------------------------------------------------------------------------------
/build/tools/toposort.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GIScience/osmatrix-client/39b564a91aa00de467128449977f322515cc5b4f/build/tools/toposort.pyc
--------------------------------------------------------------------------------
/build/tools/update_dev_dir.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | # Used to update http://openlayers.org/dev/
4 |
5 | svn up /osgeo/openlayers/docs/dev;
6 |
7 | # Get current 'Last Changed Rev'
8 | REV=`svn info /osgeo/openlayers/docs/dev/ | grep 'Revision' | awk '{print $2}'`
9 |
10 | # Get the last svn rev
11 | touch /tmp/ol_svn_rev
12 | OLD_REV="o`cat /tmp/ol_svn_rev`"
13 |
14 | # If they're not equal, do some work.
15 | if [ ! o$REV = $OLD_REV ]; then
16 |
17 | cd /osgeo/openlayers/docs/dev/tools/
18 | python exampleparser.py
19 | cd /osgeo/openlayers/docs/dev/build
20 | ./build.py
21 |
22 | cp OpenLayers.js ..
23 | cd ..
24 |
25 | sed -i -e 's!../lib/OpenLayers.js!../OpenLayers.js!' examples/*.html
26 | naturaldocs -i /osgeo/openlayers/docs/dev/lib -o HTML /osgeo/openlayers/dev/apidocs -p /osgeo/openlayers/docs/dev/apidoc_config -s Default OL >/dev/null
27 | naturaldocs -i /osgeo/openlayers/docs/dev/lib -o HTML /osgeo/openlayers/dev/docs -p /osgeo/openlayers/docs/dev/doc_config -s Default OL >/dev/null
28 |
29 | svn up /osgeo/openlayers/dev/sandbox/
30 | # Record the revision
31 | echo -n $REV > /tmp/ol_svn_rev
32 | fi
33 |
34 | svn up /osgeo/openlayers/documentation-checkout
35 | REV=`svn info /osgeo/openlayers/documentation-checkout | grep 'Last Changed Rev' | awk '{print $4}'`
36 | # Get the last svn rev
37 | touch /tmp/ol_doc_rev
38 | OLD_REV="o`cat /tmp/ol_doc_rev`"
39 | # If they're not equal, do some work.
40 | if [ ! o$REV = $OLD_REV ]; then
41 | cd /osgeo/openlayers/documentation-checkout
42 | make html > /dev/null
43 | cp -r _build/html/* /osgeo/openlayers/documentation
44 |
45 | echo -n $REV > /tmp/ol_doc_rev
46 | fi
47 |
--------------------------------------------------------------------------------
/img/ajax-loader.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GIScience/osmatrix-client/39b564a91aa00de467128449977f322515cc5b4f/img/ajax-loader.gif
--------------------------------------------------------------------------------
/img/ajax-loader_head.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GIScience/osmatrix-client/39b564a91aa00de467128449977f322515cc5b4f/img/ajax-loader_head.gif
--------------------------------------------------------------------------------
/img/giscience_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GIScience/osmatrix-client/39b564a91aa00de467128449977f322515cc5b4f/img/giscience_logo.png
--------------------------------------------------------------------------------
/img/icons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GIScience/osmatrix-client/39b564a91aa00de467128449977f322515cc5b4f/img/icons.png
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | OSMatrix
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
OSMatrix— visualizing spatio-temporal characteristics of OpenStreetMap
43 |
initializing...
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
Find place
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
Choose Layer
73 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
About OSMatrix
106 |
OSMatrix is a web-based application to visualize characteristics of OpenStreetMap, which are usually not displayed in cartographic representations of the data. The characteristics include information on the topicality of data, user contributions and the presence (or absence) of certain feature types.
107 |
108 |
OSMatrix is based on an idea of Alexander Zipf has been brought to life by Lukas Loos and Oliver Roick at GIScience Research Group at Heidelberg University.
109 |
110 |
Publications
111 |
112 |
Roick, O.; Loos, L.; Zipf, A. (2012): A Technical Framework for Visualizing Spatio-temporal Quality Metrics of Volunteered Geographic Information. Geoinformatik 2012, Braunschweig, March 2012.
113 |
Roick, O.; Hagenauer, J.; Zipf, A. (2011): OSMatrix - Grid based analysis and visualization of OpenStreetMap. State of the Map EU. Wien, July 2011.