Refactor exports and externs

This commit is contained in:
Tom Payne
2012-10-03 14:49:10 +02:00
parent d35df1d53b
commit 9d253ab6bb
17 changed files with 605 additions and 228 deletions

View File

@@ -4,8 +4,13 @@ PHANTOMJS = phantomjs
PLOVR_JAR = bin/plovr-b254c26318c5.jar PLOVR_JAR = bin/plovr-b254c26318c5.jar
SPEC = $(shell find test/spec -name \*.js) SPEC = $(shell find test/spec -name \*.js)
SRC = $(shell find externs src/ol -name \*.js) SRC = $(shell find externs src/ol -name \*.js)
INTERNAL_SRC = build/src/internal/src/requireall.js build/src/internal/src/types.js INTERNAL_SRC = \
EXTERNAL_SRC = build/src/external/externs/types.js build/src/external/src/exports.js build/src/internal/src/requireall.js \
build/src/internal/src/types.js
EXTERNAL_SRC = \
build/src/external/externs/types.js \
build/src/external/src/exports.js \
build/src/external/src/types.js
EXAMPLES = $(shell find examples -maxdepth 1 -name \*.html) EXAMPLES = $(shell find examples -maxdepth 1 -name \*.html)
comma := , comma := ,
empty := empty :=
@@ -34,21 +39,25 @@ build-all: build/ol-all.js
build/ol-all.js: $(PLOVR_JAR) $(SRC) $(INTERNAL_SRC) base.json build/ol-all.json build/ol-all.js: $(PLOVR_JAR) $(SRC) $(INTERNAL_SRC) base.json build/ol-all.json
java -jar $(PLOVR_JAR) build build/ol-all.json >$@ || ( rm -f $@ ; false ) java -jar $(PLOVR_JAR) build build/ol-all.json >$@ || ( rm -f $@ ; false )
build/src/external/externs/types.js: bin/generate-types src/ol/types.txt build/src/external/externs/types.js: bin/generate-exports src/ol/exports.txt
mkdir -p $(dir $@) mkdir -p $(dir $@)
bin/generate-types --externs src/ol/types.txt >$@ bin/generate-exports --externs src/ol/exports.txt >$@ || ( rm -f $@ ; false )
build/src/external/src/exports.js: bin/generate-exports src/ol/exports.txt build/src/external/src/exports.js: bin/generate-exports src/ol/exports.txt
mkdir -p $(dir $@) mkdir -p $(dir $@)
bin/generate-exports src/ol/exports.txt >$@ bin/generate-exports --exports src/ol/exports.txt >$@ || ( rm -f $@ ; false )
build/src/external/src/types.js: bin/generate-exports src/ol/exports.txt
mkdir -p $(dir $@)
bin/generate-exports --typedef src/ol/exports.txt >$@ || ( rm -f $@ ; false )
build/src/internal/src/requireall.js: bin/generate-requireall $(SRC) build/src/internal/src/requireall.js: bin/generate-requireall $(SRC)
mkdir -p $(dir $@) mkdir -p $(dir $@)
bin/generate-requireall --require=goog.dom src/ol >$@ bin/generate-requireall --require=goog.dom src/ol >$@ || ( rm -f $@ ; false )
build/src/internal/src/types.js: bin/generate-types src/ol/types.txt build/src/internal/src/types.js: bin/generate-exports src/ol/exports.txt
mkdir -p $(dir $@) mkdir -p $(dir $@)
bin/generate-types --typedef src/ol/types.txt >$@ bin/generate-exports --typedef src/ol/exports.txt >$@ || ( rm -f $@ ; false )
.PHONY: build-examples .PHONY: build-examples
build-examples: examples $(subst .html,.combined.js,$(EXAMPLES)) build-examples: examples $(subst .html,.combined.js,$(EXAMPLES))
@@ -70,7 +79,7 @@ serve: $(PLOVR_JAR) $(INTERNAL_SRC) examples
.PHONY: serve-precommit .PHONY: serve-precommit
serve-precommit: $(PLOVR_JAR) $(INTERNAL_SRC) serve-precommit: $(PLOVR_JAR) $(INTERNAL_SRC)
java -jar $(PLOVR_JAR) serve build/ol.json java -jar $(PLOVR_JAR) serve build/ol-all.json
.PHONY: lint .PHONY: lint
lint: build/lint-src-timestamp build/lint-spec-timestamp lint: build/lint-src-timestamp build/lint-spec-timestamp

View File

@@ -1,91 +1,243 @@
#!/usr/bin/env python #!/usr/bin/env python
from collections import defaultdict from collections import defaultdict
from itertools import ifilter
from operator import attrgetter
from optparse import OptionParser from optparse import OptionParser
import re import re
import sys import sys
class Type(object): def simplerepr(obj):
keys = sorted(key for key in obj.__dict__.keys() if not key.startswith('_'))
attrs = ''.join(' %s=%r' % (key, obj.__dict__[key]) for key in keys)
return '<%s%s>' % (obj.__class__.__name__, attrs)
def __init__(self, name, members=None):
class Exportable(object):
def __init__(self, name):
self.name = name self.name = name
self.namespace = '.'.join(self.name.split('.')[:-1]) or None
self.members = members or {} __repr__ = simplerepr
def export(self):
return ''
def extern(self):
return ''
def typedef(self):
return ''
class Class(Exportable):
def __init__(self, name, object_literal):
Exportable.__init__(self, name)
self.object_literal = object_literal
self.props = set()
__repr__ = simplerepr
def export(self):
lines = []
if self.object_literal is None:
lines.append('\n\ngoog.exportSymbol(\n \'%s\',\n %s);\n' % (self.name, self.name))
else:
lines.append('\n\n\n')
lines.append('/**\n')
lines.append(' * @constructor\n')
lines.append(' * @extends {%s}\n' % (self.name,))
lines.append(' * @param {%s} options Options.\n' % (self.object_literal.extern_name(),))
lines.append(' */\n')
lines.append('%sExport = function(options) {\n' % (self.name,))
lines.append(' goog.base(this, {')
lines.extend(','.join('\n %s: options.%s' % (key, key) for key in sorted(self.object_literal.prop_types.keys())))
lines.append('\n });\n')
lines.append('};\n')
lines.append('goog.inherits(%sExport, %s);\n' % (self.name, self.name))
lines.append('goog.exportSymbol(\n')
lines.append(' \'%s\',\n' % (self.name,))
lines.append(' %sExport);\n' % (self.name,))
lines.extend('goog.exportProperty(\n %s,\n \'%s\',\n %s.%s);\n' % (self.name, prop, self.name, prop) for prop in sorted(self.props))
return ''.join(lines)
class ObjectLiteral(Exportable):
def __init__(self, name):
Exportable.__init__(self, name)
self.prop_types = {}
__repr__ = simplerepr
def extern(self): def extern(self):
lines = [] lines = []
lines.append('\n\n\n')
lines.append('/**\n') lines.append('/**\n')
lines.append(' * @interface\n') lines.append(' * @interface\n')
lines.append(' */\n') lines.append(' */\n')
lines.append('%s = function() {};\n' % (self.name,)) lines.append('%s = function() {};\n' % (self.extern_name(),))
for key in sorted(self.members.keys()): for prop in sorted(self.prop_types.keys()):
lines.append('\n') lines.append('\n\n')
lines.append('\n')
lines.append('/**\n') lines.append('/**\n')
lines.append(' * @type {%s}\n' % (self.members[key],)) lines.append(' * @type {%s}\n' % (self.prop_types[prop],))
lines.append(' */\n') lines.append(' */\n')
lines.append('%s.prototype.%s;\n' % (self.name, key)) lines.append('%s.prototype.%s;\n' % (self.extern_name(), prop))
return ''.join(lines) return ''.join(lines)
def extern_name(self):
return re.sub(r'ol\.(\S+)', r'olx.\1Extern', self.name)
def extern_namespace(self):
return '.'.join(self.extern_name().split('.')[:-1]) or None
def provide(self): def provide(self):
return 'goog.provide(\'%sType\');\n' % (self.name,) return 'goog.provide(\'%sType\');\n' % (self.name,)
def typedef(self): def typedef(self):
lines = [] lines = []
lines.append('\n\n')
lines.append('/**\n') lines.append('/**\n')
for i, key in enumerate(sorted(self.members.keys())): for i, prop in enumerate(sorted(self.prop_types.keys())):
prefix = ' * @typedef {{' if i == 0 else ' * ' prefix = ' * @typedef {{' if i == 0 else ' * '
suffix = '}}' if i == len(self.members) - 1 else ',' suffix = '}}' if i == len(self.prop_types) - 1 else ','
type = self.members[key] type = self.prop_types[prop]
if '|' in type: if '|' in type:
type = '(%s)' % (type,) type = '(%s)' % (type,)
lines.append('%s%s: %s%s\n' % (prefix, key, type, suffix)) lines.append('%s%s: %s%s\n' % (prefix, prop, type, suffix))
lines.append(' */\n') lines.append(' */\n')
lines.append('%s;\n' % (self.name,)) lines.append('%s;\n' % (self.name,))
return ''.join(lines) return ''.join(lines)
class Symbol(Exportable):
def __init__(self, name, export_symbol):
Exportable.__init__(self, name)
self.export_symbol = export_symbol
self.props = set()
__repr__ = simplerepr
def export(self):
lines = []
if self.export_symbol:
lines.append('\n\ngoog.exportSymbol(\n \'%s\',\n %s);\n' % (self.name, self.name))
lines.extend('goog.exportProperty(\n %s,\n \'%s\',\n %s.%s);\n' % (self.name, prop, self.name, prop) for prop in sorted(self.props))
return ''.join(lines)
def main(argv): def main(argv):
option_parser = OptionParser() option_parser = OptionParser()
option_parser.add_option('--exports', action='store_true')
option_parser.add_option('--externs', action='store_true')
option_parser.add_option('--typedef', action='store_true')
options, args = option_parser.parse_args(argv[1:]) options, args = option_parser.parse_args(argv[1:])
objects = {}
requires = set() requires = set()
symbols = set()
properties = defaultdict(set)
for arg in args: for arg in args:
for line in open(arg): for line in open(arg):
line = line.strip() line = line.strip()
if not line: if not line:
continue continue
m = re.match('@exportSymbol\s*(?P<symbol>\S+)\Z', line) m = re.match(r'@exportClass\s+(?P<name>\S+)(?:\s+(?P<object_literal_name>\S+))?\Z', line)
if m: if m:
requires.add(m.group('symbol')) name = m.group('name')
symbols.add(m.group('symbol')) if name in objects:
raise RuntimeError(line) # Name already defined
object_literal_name = m.group('object_literal_name')
object_literal = objects[object_literal_name]
if not isinstance(object_literal, ObjectLiteral):
raise RuntimeError(line) # Undefined object literal
klass = Class(name, object_literal)
objects[name] = klass
continue continue
m = re.match('@exportProperty\s*(?P<property>\S+)\Z', line) m = re.match(r'@exportObjectLiteral\s+(?P<name>\S+)\Z', line)
if m: if m:
components = m.group('property').split('.') name = m.group('name')
if name in objects:
raise RuntimeError(line) # Name already defined
object_literal = ObjectLiteral(name)
objects[name] = object_literal
continue
m = re.match(r'@exportObjectLiteralProperty\s+(?P<prop>\S+)\s+(?P<type>\S+)\Z', line)
if m:
components = m.group('prop').split('.')
name = '.'.join(components[:-1])
if not name in objects:
raise RuntimeError(line) # Undefined object literal
object_literal = objects[name]
prop = components[-1]
if prop in object_literal.prop_types:
raise RuntimeError(line) # Duplicate property
type = m.group('type')
object_literal.prop_types[prop] = type
continue
m = re.match(r'@exportProperty\s+(?P<prop>\S+)\Z', line)
if m:
components = m.group('prop').split('.')
if components[-2] == 'prototype': if components[-2] == 'prototype':
requires.add('.'.join(components[:-2])) requires.add('.'.join(components[:-2]))
else: else:
requires.add('.'.join(components[:-1])) requires.add('.'.join(components[:-1]))
properties['.'.join(components[:-1])].add(components[-1]) name = '.'.join(components[:-1])
prop = components[-1]
if name in objects:
symbol = objects[name]
else:
symbol = Symbol(name, False)
objects[name] = symbol
symbol.props.add(prop)
continue
m = re.match(r'@exportSymbol\s+(?P<name>\S+)\Z', line)
if m:
name = m.group('name')
if name in objects:
raise RuntimeError(line) # Name already defined
symbol = Symbol(name, True)
objects[name] = symbol
requires.add(name)
continue continue
raise RuntimeError(line) raise RuntimeError(line)
if requires: objects = sorted(objects.values(), key=attrgetter('name'))
for require in sorted(requires):
sys.stdout.write('goog.require(\'%s\');\n' % (require,)) if options.exports:
sys.stdout.write('\n\n') requires.update(obj.name for obj in objects if isinstance(obj, Class))
for i, obj in enumerate(sorted(symbols | set(properties.keys()))): if requires:
if i: for require in sorted(requires):
sys.stdout.write('\n') sys.stdout.write('goog.require(\'%s\');\n' % (require,))
if obj in symbols: for obj in objects:
sys.stdout.write('goog.exportSymbol(\n \'%s\',\n %s);\n' % (obj, obj)) sys.stdout.write(obj.export())
for prop in properties[obj]:
sys.stdout.write('goog.exportProperty(\n %s,\n \'%s\',\n %s.%s);\n' % (obj, prop, obj, prop)) if options.externs:
object_literals = [obj for obj in objects if isinstance(obj, ObjectLiteral)]
sys.stdout.write('/**\n')
sys.stdout.write(' * @externs\n')
sys.stdout.write(' */\n')
namespaces = sorted(set(filter(None, (object_literal.extern_namespace() for object_literal in object_literals))))
for namespace in namespaces:
sys.stdout.write('\n\n')
sys.stdout.write('/**\n')
sys.stdout.write(' * @type {Object}\n')
sys.stdout.write(' */\n')
if '.' in namespace:
sys.stdout.write('%s = {};\n' % (namespace,))
else:
sys.stdout.write('var %s;\n' % (namespace,))
for object_literal in object_literals:
sys.stdout.write(object_literal.extern())
if options.typedef:
object_literals = [obj for obj in objects if isinstance(obj, ObjectLiteral)]
for object_literal in object_literals:
sys.stdout.write(object_literal.provide())
for object_literal in object_literals:
sys.stdout.write(object_literal.typedef())
if __name__ == '__main__': if __name__ == '__main__':

View File

@@ -1,102 +0,0 @@
#!/usr/bin/env python
import fileinput
from operator import attrgetter
from optparse import OptionParser
import re
import sys
class Type(object):
def __init__(self, name, members=None):
self.name = name
self.namespace = '.'.join(self.name.split('.')[:-1]) or None
self.members = members or {}
def extern(self):
lines = []
lines.append('/**\n')
lines.append(' * @interface\n')
lines.append(' */\n')
lines.append('%s = function() {};\n' % (self.name,))
for key in sorted(self.members.keys()):
lines.append('\n')
lines.append('\n')
lines.append('/**\n')
lines.append(' * @type {%s}\n' % (self.members[key],))
lines.append(' */\n')
lines.append('%s.prototype.%s;\n' % (self.name, key))
return ''.join(lines)
def provide(self):
return 'goog.provide(\'%s\');\n' % (self.name,)
def typedef(self):
lines = []
lines.append('/**\n')
for i, key in enumerate(sorted(self.members.keys())):
prefix = ' * @typedef {{' if i == 0 else ' * '
suffix = '}}' if i == len(self.members) - 1 else ','
type = self.members[key]
if '|' in type:
type = '(%s)' % (type,)
lines.append('%s%s: %s%s\n' % (prefix, key, type, suffix))
lines.append(' */\n')
lines.append('%s;\n' % (self.name,))
return ''.join(lines)
def main(argv):
option_parser = OptionParser()
option_parser.add_option('--externs', action='store_true')
option_parser.add_option('--typedef', action='store_true')
options, args = option_parser.parse_args(argv[1:])
types = []
for arg in args:
for line in open(arg):
line = line.strip()
if not line:
continue
m = re.match('@exportType\s*(?P<name>\S+)\Z', line)
if m:
type = Type(m.group('name'))
types.append(type)
continue
m = re.match('(?P<key>\S+):\s+(?P<value>\S+)', line)
if m:
type.members[m.group('key')] = m.group('value')
continue
raise RuntimeError(line)
types = sorted(types, key=attrgetter('name'))
if options.externs:
sys.stdout.write('/**\n')
sys.stdout.write(' * @externs\n')
sys.stdout.write(' */\n')
namespaces = sorted(set(filter(None, (type.namespace for type in types))))
for namespace in namespaces:
sys.stdout.write('\n\n')
sys.stdout.write('/**\n')
sys.stdout.write(' * @type {Object}\n')
sys.stdout.write(' */\n')
if '.' in namespace:
sys.stdout.write('%s = {};\n' % (namespace,))
else:
sys.stdout.write('var %s;\n' % (namespace,))
for type in types:
sys.stdout.write('\n\n\n')
sys.stdout.write(type.extern())
if options.typedef:
for type in types:
sys.stdout.write(type.provide())
for type in types:
sys.stdout.write('\n\n')
sys.stdout.write(type.typedef())
if __name__ == '__main__':
sys.exit(main(sys.argv))

View File

@@ -22,7 +22,8 @@
"inherits": "../base.json", "inherits": "../base.json",
"inputs": [ "inputs": [
"build/src/external/src/exports.js" "build/src/external/src/exports.js",
"build/src/external/src/types.js"
], ],
"output-wrapper": "(function(){%output%})();", "output-wrapper": "(function(){%output%})();",

View File

@@ -0,0 +1,35 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
<link rel="stylesheet" href="../style.css" type="text/css">
<style type="text/css">
html, body, #map {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
</style>
<link rel="stylesheet" href="../../css/ol.css" type="text/css">
<title>ol3 full-screen demo</title>
<script src="../../build/ol.js" type="text/javascript"></script>
</head>
<body>
<div id="map"></div>
<script type="text/javascript">
var layer = new ol.layer.TileLayer({
source: new ol.source.MapQuestOpenAerial()
});
var map = new ol.Map({
center: new ol.Coordinate(0, 0),
layers: new ol.Collection([layer]),
target: 'map',
zoom: 2
});
</script>
</body>
</html>

View File

@@ -0,0 +1,116 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
<link rel="stylesheet" href="../style.css" type="text/css">
<style type="text/css">
html, body, #map {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
.overlay {
display: none;
font-size: 10pt;
}
.ol-overlaycontainer .overlay {
display: block;
}
#vienna {
text-decoration: none;
color: white;
font-size: 11pt;
font-weight: bold;
text-shadow: black 0.1em 0.1em 0.2em;
}
#popup {
width: 200px;
margin-left: -107px;
margin-bottom: 12px;
border-radius: 5px;
padding: 5px;
}
/* Popup CSS generated with http://cssarrowplease.com/ */
.arrow_box {
position: relative;
background: #88b7d5;
border: 2px solid #c2e1f5;
}
.arrow_box:after, .arrow_box:before {
top: 100%;
border: solid transparent;
content: " ";
height: 0;
width: 0;
position: absolute;
pointer-events: none;
}
.arrow_box:after {
border-color: rgba(136, 183, 213, 0);
border-top-color: #88b7d5;
border-width: 10px;
left: 50%;
margin-left: -10px;
}
.arrow_box:before {
border-color: rgba(194, 225, 245, 0);
border-top-color: #c2e1f5;
border-width: 13px;
left: 50%;
margin-left: -13px;
}
</style>
<link rel="stylesheet" href="../../css/ol.css" type="text/css">
<title>ol3 overlay-and-popup demo</title>
<script src="../../build/ol.js" type="text/javascript"></script>
</head>
<body>
<div id="map">
<!-- Clickable label for Vienna -->
<a class="overlay" id="vienna" target="_blank" href="http://en.wikipedia.org/wiki/Vienna">Vienna</a>
<!-- Popup -->
<div class="overlay arrow_box" id="popup"></div>
</div>
<script type="text/javascript">
var layer = new ol.layer.TileLayer({
source: new ol.source.MapQuestOpenAerial()
});
var map = new ol.Map({
center: new ol.Coordinate(0, 0),
layers: new ol.Collection([layer]),
target: 'map',
zoom: 2
});
// Vienna label
var vienna = new ol.overlay.Overlay({
map: map,
coordinate: ol.Projection.transformWithCodes(
new ol.Coordinate(16.3725, 48.208889), 'EPSG:4326', 'EPSG:3857'),
element: document.getElementById('vienna')
});
// Popup showing the position the user clicked
var popup = new ol.overlay.Overlay({
element: document.getElementById('popup')
});
map.addEventListener('click', function(evt) {
var coordinate = evt.getCoordinate();
popup.getElement().innerHTML =
'Welcome to ol3. The location you clicked was<br>' +
ol.CoordinateFormat.hdms(ol.Projection.transformWithCodes(
coordinate, 'EPSG:3857', 'EPSG:4326'));
popup.setMap(evt.map);
popup.setCoordinate(evt.getCoordinate());
});
</script>
</body>
</html>

View File

@@ -0,0 +1,157 @@
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="../../css/ol.css" type="text/css">
<link rel="stylesheet" href="../style.css" type="text/css">
<style type="text/css">
.map {
width: 400px;
height: 400px;
border: thin solid #cccccc;
margin: 1em;
}
</style>
<title>ol3 side-by-side demo</title>
<script src="../../build/ol.js" type="text/javascript"></script>
</head>
<body>
<h1>ol3 side-by-side demo</h1>
<table>
<tr>
<th>DOM</th>
<th>WebGL</th>
</tr>
<tr>
<td><div id="domMap" class="map"></div></td>
<td><div id="webglMap" class="map"></div></td>
</tr>
<tr>
<td><div id="domMousePosition" class="mouseposition"></div></td>
<td><div id="webglMousePosition" class="mouseposition"></div></td>
</tr>
</table>
<table>
<tr>
<td>Pan:</td>
<td>drag, arrow keys</td>
</tr>
<tr>
<td>Zoom:</td>
<td>double-click, <code>Shift</code>+double-click, mouse wheel, <code>+</code>/<code>-</code> keys; <code>Shift</code>+drag</td>
</tr>
<tr>
<td>Rotate:</td>
<td><code>Alt</code>+drag, <code>r</code> to reset</td>
</tr>
<tr>
<td>Brightness/contrast:</td>
<td><code>b</code>/<code>B</code>/<code>c</code>/<code>C</code> keys (WebGL only)</td>
</tr>
<tr>
<td>Hue/saturation:</td>
<td><code>h</code>/<code>H</code>/<code>s</code>/<code>S</code> keys (WebGL only)</td>
</tr>
<tr>
<td>Opacity:</td>
<td><code>o</code>/<code>O</code> keys</td>
</tr>
<tr>
<td>Visibility:</td>
<td><code>v</code>/<code>V</code> keys</td>
</tr>
<tr>
<td>Reset</td>
<td><code>0</code> key</td>
</tr>
</table>
<p><b>Notes:</b> The two maps share the same center, resolution, rotation and layers.</p>
<script type="text/javascript">
var layer = new ol.layer.TileLayer({
source: new ol.source.MapQuestOpenAerial()
});
var domMap = new ol.Map({
center: new ol.Coordinate(0, 0),
layers: new ol.Collection([layer]),
renderer: ol.RendererHint.DOM,
target: 'domMap',
zoom: 1
});
domMap.getControls().push(new ol.control.MousePosition({
coordinateFormat: ol.CoordinateFormat.hdms,
projection: ol.Projection.getFromCode('EPSG:4326'),
target: document.getElementById('domMousePosition'),
undefinedHtml: '&nbsp;'
}));
var webglMap = new ol.Map({
renderer: ol.RendererHint.WEBGL,
target: 'webglMap'
});
if (webglMap) {
webglMap.bindTo('center', domMap);
webglMap.bindTo('layers', domMap);
webglMap.bindTo('resolution', domMap);
webglMap.bindTo('rotation', domMap);
}
webglMap.getControls().push(new ol.control.MousePosition({
coordinateFormat: ol.CoordinateFormat.hdms,
projection: ol.Projection.getFromCode('EPSG:4326'),
target: document.getElementById('webglMousePosition'),
undefinedHtml: '&nbsp;'
}));
var keyboardInteraction = new ol.interaction.Keyboard();
keyboardInteraction.addCallback('0', function() {
layer.setBrightness(0);
layer.setContrast(0);
layer.setHue(0);
layer.setSaturation(0);
layer.setOpacity(1);
layer.setVisible(true);
});
keyboardInteraction.addCallback('b', function() {
layer.setBrightness(layer.getBrightness() - 0.1);
});
keyboardInteraction.addCallback('B', function() {
layer.setBrightness(layer.getBrightness() + 0.1);
});
keyboardInteraction.addCallback('c', function() {
layer.setContrast(layer.getContrast() - 0.1);
});
keyboardInteraction.addCallback('C', function() {
layer.setContrast(layer.getContrast() + 0.1);
});
keyboardInteraction.addCallback('h', function() {
layer.setHue(layer.getHue() - 0.1);
});
keyboardInteraction.addCallback('H', function() {
layer.setHue(layer.getHue() + 0.1);
});
keyboardInteraction.addCallback('o', function() {
layer.setOpacity(layer.getOpacity() - 0.1);
});
keyboardInteraction.addCallback('O', function() {
layer.setOpacity(layer.getOpacity() + 0.1);
});
keyboardInteraction.addCallback('r', function() {
webglMap.setRotation(0);
});
keyboardInteraction.addCallback('s', function() {
layer.setSaturation(layer.getSaturation() - 0.1);
});
keyboardInteraction.addCallback('S', function() {
layer.setSaturation(layer.getSaturation() + 0.1);
});
keyboardInteraction.addCallback('vV', function() {
layer.setVisible(!layer.getVisible());
});
domMap.getInteractions().push(keyboardInteraction);
</script>
</body>
</html>

View File

@@ -4,7 +4,6 @@
// FIXME check clean-up code // FIXME check clean-up code
goog.provide('ol.control.Attribution'); goog.provide('ol.control.Attribution');
goog.provide('ol.control.AttributionOptions');
goog.require('goog.dom'); goog.require('goog.dom');
goog.require('goog.dom.TagName'); goog.require('goog.dom.TagName');
@@ -19,13 +18,6 @@ goog.require('ol.control.Control');
goog.require('ol.layer.Layer'); goog.require('ol.layer.Layer');
/**
* @typedef {{map: (ol.Map|undefined),
* target: (Element|undefined)}}
*/
ol.control.AttributionOptions;
/** /**
* @constructor * @constructor

View File

@@ -1,7 +1,6 @@
// FIXME should listen on appropriate pane, once it is defined // FIXME should listen on appropriate pane, once it is defined
goog.provide('ol.control.MousePosition'); goog.provide('ol.control.MousePosition');
goog.provide('ol.control.MousePositionOptions');
goog.require('goog.events'); goog.require('goog.events');
goog.require('goog.events.EventType'); goog.require('goog.events.EventType');
@@ -13,16 +12,6 @@ goog.require('ol.TransformFunction');
goog.require('ol.control.Control'); goog.require('ol.control.Control');
/**
* @typedef {{coordinateFormat: (ol.CoordinateFormatType|undefined),
* map: (ol.Map|undefined),
* projection: (ol.Projection|undefined),
* target: (Element|undefined),
* undefinedHtml: (string|undefined)}}
*/
ol.control.MousePositionOptions;
/** /**
* @constructor * @constructor

View File

@@ -1,5 +1,4 @@
goog.provide('ol.control.Zoom'); goog.provide('ol.control.Zoom');
goog.provide('ol.control.ZoomOptions');
goog.require('goog.dom'); goog.require('goog.dom');
goog.require('goog.dom.TagName'); goog.require('goog.dom.TagName');
@@ -10,14 +9,6 @@ goog.require('ol.Projection');
goog.require('ol.control.Control'); goog.require('ol.control.Control');
/**
* @typedef {{delta: (number|undefined),
* map: (ol.Map|undefined),
* target: (Element|undefined)}}
*/
ol.control.ZoomOptions;
/** /**
* @constructor * @constructor

View File

@@ -1,3 +1,5 @@
@exportProperty ol.MapBrowserEvent.prototype.getCoordinate
@exportSymbol ol.Collection @exportSymbol ol.Collection
@exportProperty ol.Collection.prototype.clear @exportProperty ol.Collection.prototype.clear
@exportProperty ol.Collection.prototype.forEach @exportProperty ol.Collection.prototype.forEach
@@ -12,9 +14,40 @@
@exportSymbol ol.Coordinate @exportSymbol ol.Coordinate
@exportSymbol ol.CoordinateFormat
@exportProperty ol.CoordinateFormat.hdms
@exportSymbol ol.Extent @exportSymbol ol.Extent
@exportSymbol ol.Map @exportObjectLiteral ol.MapOptions
@exportObjectLiteralProperty ol.MapOptions.center ol.Coordinate|undefined
@exportObjectLiteralProperty ol.MapOptions.controls ol.Collection|undefined
@exportObjectLiteralProperty ol.MapOptions.doubleClickZoom boolean|undefined
@exportObjectLiteralProperty ol.MapOptions.dragPan boolean|undefined
@exportObjectLiteralProperty ol.MapOptions.interactions ol.Collection|undefined
@exportObjectLiteralProperty ol.MapOptions.keyboard boolean|undefined
@exportObjectLiteralProperty ol.MapOptions.keyboardPanOffset number|undefined
@exportObjectLiteralProperty ol.MapOptions.layers ol.Collection|undefined
@exportObjectLiteralProperty ol.MapOptions.maxResolution number|undefined
@exportObjectLiteralProperty ol.MapOptions.mouseWheelZoom boolean|undefined
@exportObjectLiteralProperty ol.MapOptions.mouseWheelZoomDelta number|undefined
@exportObjectLiteralProperty ol.MapOptions.numZoomLevels number|undefined
@exportObjectLiteralProperty ol.MapOptions.projection ol.Projection|string|undefined
@exportObjectLiteralProperty ol.MapOptions.renderer ol.RendererHint|undefined
@exportObjectLiteralProperty ol.MapOptions.renderers Array.<ol.RendererHint>|undefined
@exportObjectLiteralProperty ol.MapOptions.resolution number|undefined
@exportObjectLiteralProperty ol.MapOptions.resolutions Array.<number>|undefined
@exportObjectLiteralProperty ol.MapOptions.rotate boolean|undefined
@exportObjectLiteralProperty ol.MapOptions.shiftDragZoom boolean|undefined
@exportObjectLiteralProperty ol.MapOptions.target Element|string
@exportObjectLiteralProperty ol.MapOptions.userProjection ol.Projection|string|undefined
@exportObjectLiteralProperty ol.MapOptions.zoom number|undefined
@exportObjectLiteralProperty ol.MapOptions.zoomDelta number|undefined
@exportObjectLiteralProperty ol.MapOptions.zoomFactor number|undefined
@exportClass ol.Map ol.MapOptions
@exportProperty ol.Map.prototype.getControls
@exportProperty ol.Map.prototype.getInteractions
@exportSymbol ol.Object @exportSymbol ol.Object
@exportProperty ol.Object.prototype.bindTo @exportProperty ol.Object.prototype.bindTo
@@ -32,13 +65,61 @@
@exportProperty ol.Projection.getTransform @exportProperty ol.Projection.getTransform
@exportProperty ol.Projection.getTransformFromCodes @exportProperty ol.Projection.getTransformFromCodes
@exportProperty ol.Projection.transform @exportProperty ol.Projection.transform
@exportProperty ol.Projection.transformWithCodes
@exportProperty ol.Projection.prototype.getCode @exportProperty ol.Projection.prototype.getCode
@exportProperty ol.Projection.prototype.getExtent @exportProperty ol.Projection.prototype.getExtent
@exportProperty ol.Projection.prototype.getUnits @exportProperty ol.Projection.prototype.getUnits
@exportSymbol ol.layer.TileLayer @exportSymbol ol.RendererHint
@exportProperty ol.RendererHint.DOM
@exportProperty ol.RendererHint.WEBGL
@exportSymbol ol.overlay.Overlay @exportObjectLiteral ol.control.AttributionOptions
@exportObjectLiteralProperty ol.control.AttributionOptions.map ol.Map|undefined
@exportObjectLiteralProperty ol.control.AttributionOptions.target Element|undefined
@exportClass ol.control.Attribution ol.control.AttributionOptions
@exportObjectLiteral ol.control.MousePositionOptions
@exportObjectLiteralProperty ol.control.MousePositionOptions.coordinateFormat ol.CoordinateFormatType|undefined
@exportObjectLiteralProperty ol.control.MousePositionOptions.map ol.Map|undefined
@exportObjectLiteralProperty ol.control.MousePositionOptions.projection ol.Projection|undefined
@exportObjectLiteralProperty ol.control.MousePositionOptions.target Element|undefined
@exportObjectLiteralProperty ol.control.MousePositionOptions.undefinedHtml string|undefined
@exportClass ol.control.MousePosition ol.control.MousePositionOptions
@exportObjectLiteral ol.control.ZoomOptions
@exportObjectLiteralProperty ol.control.ZoomOptions.delta number|undefined
@exportObjectLiteralProperty ol.control.ZoomOptions.map ol.Map|undefined
@exportObjectLiteralProperty ol.control.ZoomOptions.target Element|undefined
@exportClass ol.control.Zoom ol.control.ZoomOptions
@exportObjectLiteral ol.layer.LayerOptions
@exportObjectLiteralProperty ol.layer.LayerOptions.brightness number|undefined
@exportObjectLiteralProperty ol.layer.LayerOptions.contrast number|undefined
@exportObjectLiteralProperty ol.layer.LayerOptions.hue number|undefined
@exportObjectLiteralProperty ol.layer.LayerOptions.opacity number|undefined
@exportObjectLiteralProperty ol.layer.LayerOptions.saturation number|undefined
@exportObjectLiteralProperty ol.layer.LayerOptions.source ol.source.Source
@exportObjectLiteralProperty ol.layer.LayerOptions.visible boolean|undefined
@exportSymbol ol.interaction.Keyboard
@exportProperty ol.interaction.Keyboard.prototype.addCallback
@exportClass ol.layer.TileLayer ol.layer.LayerOptions
@exportObjectLiteral ol.overlay.OverlayOptions
@exportObjectLiteralProperty ol.overlay.OverlayOptions.coordinate ol.Coordinate|undefined
@exportObjectLiteralProperty ol.overlay.OverlayOptions.element Element|undefined
@exportObjectLiteralProperty ol.overlay.OverlayOptions.map ol.Map|undefined
@exportObjectLiteralProperty ol.overlay.OverlayOptions.positioning Array.<string>|undefined
@exportClass ol.overlay.Overlay ol.overlay.OverlayOptions
@exportProperty ol.overlay.Overlay.prototype.getElement
@exportProperty ol.overlay.Overlay.prototype.setCoordinate
@exportProperty ol.overlay.Overlay.prototype.setMap
@exportSymbol ol.source.BingMaps @exportSymbol ol.source.BingMaps

View File

@@ -25,7 +25,7 @@ ol.layer.LayerProperty = {
/** /**
* @constructor * @constructor
* @extends {ol.Object} * @extends {ol.Object}
* @param {olx.layer.LayerOptions} layerOptions LayerOptions. * @param {ol.layer.LayerOptions} layerOptions LayerOptions.
*/ */
ol.layer.Layer = function(layerOptions) { ol.layer.Layer = function(layerOptions) {

View File

@@ -8,7 +8,7 @@ goog.require('ol.source.TileSource');
/** /**
* @constructor * @constructor
* @extends {ol.layer.Layer} * @extends {ol.layer.Layer}
* @param {olx.layer.LayerOptions} layerOptions Layer options. * @param {ol.layer.LayerOptions} layerOptions Layer options.
*/ */
ol.layer.TileLayer = function(layerOptions) { ol.layer.TileLayer = function(layerOptions) {
goog.base(this, layerOptions); goog.base(this, layerOptions);

View File

@@ -115,7 +115,7 @@ ol.MapProperty = {
* @constructor * @constructor
* @extends {ol.Object} * @extends {ol.Object}
* @implements {goog.fx.anim.Animated} * @implements {goog.fx.anim.Animated}
* @param {olx.MapOptions} mapOptions Map options. * @param {ol.MapOptions} mapOptions Map options.
*/ */
ol.Map = function(mapOptions) { ol.Map = function(mapOptions) {
@@ -956,7 +956,7 @@ ol.MapOptionsInternal;
/** /**
* @param {olx.MapOptions} mapOptions Map options. * @param {ol.MapOptions} mapOptions Map options.
* @return {ol.MapOptionsInternal} Map options. * @return {ol.MapOptionsInternal} Map options.
*/ */
ol.Map.createOptionsInternal = function(mapOptions) { ol.Map.createOptionsInternal = function(mapOptions) {
@@ -1063,7 +1063,7 @@ ol.Map.createOptionsInternal = function(mapOptions) {
/** /**
* @private * @private
* @param {olx.MapOptions} mapOptions Map options. * @param {ol.MapOptions} mapOptions Map options.
* @return {ol.Constraints} Map constraints. * @return {ol.Constraints} Map constraints.
*/ */
ol.Map.createConstraints_ = function(mapOptions) { ol.Map.createConstraints_ = function(mapOptions) {
@@ -1097,7 +1097,7 @@ ol.Map.createConstraints_ = function(mapOptions) {
/** /**
* @private * @private
* @param {olx.MapOptions} mapOptions Map options. * @param {ol.MapOptions} mapOptions Map options.
* @return {ol.Collection} Controls. * @return {ol.Collection} Controls.
*/ */
ol.Map.createControls_ = function(mapOptions) { ol.Map.createControls_ = function(mapOptions) {
@@ -1119,7 +1119,7 @@ ol.Map.createControls_ = function(mapOptions) {
/** /**
* @private * @private
* @param {olx.MapOptions} mapOptions Map options. * @param {ol.MapOptions} mapOptions Map options.
* @return {ol.Collection} Interactions. * @return {ol.Collection} Interactions.
*/ */
ol.Map.createInteractions_ = function(mapOptions) { ol.Map.createInteractions_ = function(mapOptions) {

View File

@@ -1,20 +1,10 @@
goog.provide('ol.overlay.Overlay'); goog.provide('ol.overlay.Overlay');
goog.provide('ol.overlay.OverlayOptions');
goog.provide('ol.overlay.OverlayPositioning'); goog.provide('ol.overlay.OverlayPositioning');
goog.require('goog.events'); goog.require('goog.events');
goog.require('goog.style'); goog.require('goog.style');
/**
* @typedef {{coordinate: (ol.Coordinate|undefined),
* element: (Element|undefined),
* map: (ol.Map|undefined),
* positioning: (Array.<string>|undefined)}}
*/
ol.overlay.OverlayOptions;
/** /**
* @constructor * @constructor

View File

@@ -1,34 +0,0 @@
@exportType olx.MapOptions
center: ol.Coordinate|undefined
controls: ol.Collection|undefined
doubleClickZoom: boolean|undefined
dragPan: boolean|undefined
interactions: ol.Collection|undefined
keyboard: boolean|undefined
keyboardPanOffset: number|undefined
layers: ol.Collection|undefined
maxResolution: number|undefined
mouseWheelZoom: boolean|undefined
mouseWheelZoomDelta: number|undefined
numZoomLevels: number|undefined
projection: ol.Projection|string|undefined
renderer: ol.RendererHint|undefined
renderers: Array.<ol.RendererHint>|undefined
resolution: number|undefined
resolutions: Array.<number>|undefined
rotate: boolean|undefined
shiftDragZoom: boolean|undefined
target: Element|string
userProjection: ol.Projection|string|undefined
zoom: number|undefined
zoomDelta: number|undefined
zoomFactor: number|undefined
@exportType olx.layer.LayerOptions
brightness: number|undefined
contrast: number|undefined
hue: number|undefined
opacity: number|undefined
saturation: number|undefined
source: ol.source.Source
visible: boolean|undefined

View File

@@ -37,7 +37,7 @@
// Create the script tag which includes the derived variables from above // Create the script tag which includes the derived variables from above
var script = '<sc' + 'ript type="text/javascript" ' var script = '<sc' + 'ript type="text/javascript" '
+ 'src="http://' + plovrHost + '/compile?id=ol&mode=RAW">' + 'src="http://' + plovrHost + '/compile?id=ol-all&mode=RAW">'
+ '</scr' + 'ipt>'; + '</scr' + 'ipt>';
// this function will fix the links of the result to also include // this function will fix the links of the result to also include