Refactor exports and externs
This commit is contained in:
27
Makefile
27
Makefile
@@ -4,8 +4,13 @@ PHANTOMJS = phantomjs
|
||||
PLOVR_JAR = bin/plovr-b254c26318c5.jar
|
||||
SPEC = $(shell find test/spec -name \*.js)
|
||||
SRC = $(shell find externs src/ol -name \*.js)
|
||||
INTERNAL_SRC = 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
|
||||
INTERNAL_SRC = \
|
||||
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)
|
||||
comma := ,
|
||||
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
|
||||
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 $@)
|
||||
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
|
||||
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)
|
||||
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 $@)
|
||||
bin/generate-types --typedef src/ol/types.txt >$@
|
||||
bin/generate-exports --typedef src/ol/exports.txt >$@ || ( rm -f $@ ; false )
|
||||
|
||||
.PHONY: build-examples
|
||||
build-examples: examples $(subst .html,.combined.js,$(EXAMPLES))
|
||||
@@ -70,7 +79,7 @@ serve: $(PLOVR_JAR) $(INTERNAL_SRC) examples
|
||||
|
||||
.PHONY: serve-precommit
|
||||
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
|
||||
lint: build/lint-src-timestamp build/lint-spec-timestamp
|
||||
|
||||
@@ -1,91 +1,243 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from collections import defaultdict
|
||||
from itertools import ifilter
|
||||
from operator import attrgetter
|
||||
from optparse import OptionParser
|
||||
import re
|
||||
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.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):
|
||||
lines = []
|
||||
lines.append('\n\n\n')
|
||||
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('%s = function() {};\n' % (self.extern_name(),))
|
||||
for prop in sorted(self.prop_types.keys()):
|
||||
lines.append('\n\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('%s.prototype.%s;\n' % (self.name, key))
|
||||
lines.append('%s.prototype.%s;\n' % (self.extern_name(), prop))
|
||||
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):
|
||||
return 'goog.provide(\'%sType\');\n' % (self.name,)
|
||||
|
||||
def typedef(self):
|
||||
lines = []
|
||||
lines.append('\n\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 ' * '
|
||||
suffix = '}}' if i == len(self.members) - 1 else ','
|
||||
type = self.members[key]
|
||||
suffix = '}}' if i == len(self.prop_types) - 1 else ','
|
||||
type = self.prop_types[prop]
|
||||
if '|' in 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('%s;\n' % (self.name,))
|
||||
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):
|
||||
|
||||
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:])
|
||||
|
||||
objects = {}
|
||||
requires = set()
|
||||
symbols = set()
|
||||
properties = defaultdict(set)
|
||||
for arg in args:
|
||||
for line in open(arg):
|
||||
line = line.strip()
|
||||
if not line:
|
||||
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:
|
||||
requires.add(m.group('symbol'))
|
||||
symbols.add(m.group('symbol'))
|
||||
name = m.group('name')
|
||||
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
|
||||
m = re.match('@exportProperty\s*(?P<property>\S+)\Z', line)
|
||||
m = re.match(r'@exportObjectLiteral\s+(?P<name>\S+)\Z', line)
|
||||
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':
|
||||
requires.add('.'.join(components[:-2]))
|
||||
else:
|
||||
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
|
||||
raise RuntimeError(line)
|
||||
|
||||
objects = sorted(objects.values(), key=attrgetter('name'))
|
||||
|
||||
if options.exports:
|
||||
requires.update(obj.name for obj in objects if isinstance(obj, Class))
|
||||
if requires:
|
||||
for require in sorted(requires):
|
||||
sys.stdout.write('goog.require(\'%s\');\n' % (require,))
|
||||
for obj in objects:
|
||||
sys.stdout.write(obj.export())
|
||||
|
||||
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')
|
||||
for i, obj in enumerate(sorted(symbols | set(properties.keys()))):
|
||||
if i:
|
||||
sys.stdout.write('\n')
|
||||
if obj in symbols:
|
||||
sys.stdout.write('goog.exportSymbol(\n \'%s\',\n %s);\n' % (obj, obj))
|
||||
for prop in properties[obj]:
|
||||
sys.stdout.write('goog.exportProperty(\n %s,\n \'%s\',\n %s.%s);\n' % (obj, prop, obj, prop))
|
||||
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__':
|
||||
|
||||
@@ -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))
|
||||
@@ -22,7 +22,8 @@
|
||||
"inherits": "../base.json",
|
||||
|
||||
"inputs": [
|
||||
"build/src/external/src/exports.js"
|
||||
"build/src/external/src/exports.js",
|
||||
"build/src/external/src/types.js"
|
||||
],
|
||||
|
||||
"output-wrapper": "(function(){%output%})();",
|
||||
|
||||
35
examples/standalone/full-screen-standalone.html
Normal file
35
examples/standalone/full-screen-standalone.html
Normal 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>
|
||||
116
examples/standalone/overlay-and-popup-standalone.html
Normal file
116
examples/standalone/overlay-and-popup-standalone.html
Normal 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>
|
||||
157
examples/standalone/side-by-side-standalone.html
Normal file
157
examples/standalone/side-by-side-standalone.html
Normal 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: ' '
|
||||
}));
|
||||
|
||||
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: ' '
|
||||
}));
|
||||
|
||||
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>
|
||||
@@ -4,7 +4,6 @@
|
||||
// FIXME check clean-up code
|
||||
|
||||
goog.provide('ol.control.Attribution');
|
||||
goog.provide('ol.control.AttributionOptions');
|
||||
|
||||
goog.require('goog.dom');
|
||||
goog.require('goog.dom.TagName');
|
||||
@@ -19,13 +18,6 @@ goog.require('ol.control.Control');
|
||||
goog.require('ol.layer.Layer');
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{map: (ol.Map|undefined),
|
||||
* target: (Element|undefined)}}
|
||||
*/
|
||||
ol.control.AttributionOptions;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// FIXME should listen on appropriate pane, once it is defined
|
||||
|
||||
goog.provide('ol.control.MousePosition');
|
||||
goog.provide('ol.control.MousePositionOptions');
|
||||
|
||||
goog.require('goog.events');
|
||||
goog.require('goog.events.EventType');
|
||||
@@ -13,16 +12,6 @@ goog.require('ol.TransformFunction');
|
||||
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
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
goog.provide('ol.control.Zoom');
|
||||
goog.provide('ol.control.ZoomOptions');
|
||||
|
||||
goog.require('goog.dom');
|
||||
goog.require('goog.dom.TagName');
|
||||
@@ -10,14 +9,6 @@ goog.require('ol.Projection');
|
||||
goog.require('ol.control.Control');
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{delta: (number|undefined),
|
||||
* map: (ol.Map|undefined),
|
||||
* target: (Element|undefined)}}
|
||||
*/
|
||||
ol.control.ZoomOptions;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@exportProperty ol.MapBrowserEvent.prototype.getCoordinate
|
||||
|
||||
@exportSymbol ol.Collection
|
||||
@exportProperty ol.Collection.prototype.clear
|
||||
@exportProperty ol.Collection.prototype.forEach
|
||||
@@ -12,9 +14,40 @@
|
||||
|
||||
@exportSymbol ol.Coordinate
|
||||
|
||||
@exportSymbol ol.CoordinateFormat
|
||||
@exportProperty ol.CoordinateFormat.hdms
|
||||
|
||||
@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
|
||||
@exportProperty ol.Object.prototype.bindTo
|
||||
@@ -32,13 +65,61 @@
|
||||
@exportProperty ol.Projection.getTransform
|
||||
@exportProperty ol.Projection.getTransformFromCodes
|
||||
@exportProperty ol.Projection.transform
|
||||
@exportProperty ol.Projection.transformWithCodes
|
||||
@exportProperty ol.Projection.prototype.getCode
|
||||
@exportProperty ol.Projection.prototype.getExtent
|
||||
@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
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ ol.layer.LayerProperty = {
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.Object}
|
||||
* @param {olx.layer.LayerOptions} layerOptions LayerOptions.
|
||||
* @param {ol.layer.LayerOptions} layerOptions LayerOptions.
|
||||
*/
|
||||
ol.layer.Layer = function(layerOptions) {
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ goog.require('ol.source.TileSource');
|
||||
/**
|
||||
* @constructor
|
||||
* @extends {ol.layer.Layer}
|
||||
* @param {olx.layer.LayerOptions} layerOptions Layer options.
|
||||
* @param {ol.layer.LayerOptions} layerOptions Layer options.
|
||||
*/
|
||||
ol.layer.TileLayer = function(layerOptions) {
|
||||
goog.base(this, layerOptions);
|
||||
|
||||
@@ -115,7 +115,7 @@ ol.MapProperty = {
|
||||
* @constructor
|
||||
* @extends {ol.Object}
|
||||
* @implements {goog.fx.anim.Animated}
|
||||
* @param {olx.MapOptions} mapOptions Map options.
|
||||
* @param {ol.MapOptions} mapOptions Map options.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
ol.Map.createOptionsInternal = function(mapOptions) {
|
||||
@@ -1063,7 +1063,7 @@ ol.Map.createOptionsInternal = function(mapOptions) {
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param {olx.MapOptions} mapOptions Map options.
|
||||
* @param {ol.MapOptions} mapOptions Map options.
|
||||
* @return {ol.Constraints} Map constraints.
|
||||
*/
|
||||
ol.Map.createConstraints_ = function(mapOptions) {
|
||||
@@ -1097,7 +1097,7 @@ ol.Map.createConstraints_ = function(mapOptions) {
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param {olx.MapOptions} mapOptions Map options.
|
||||
* @param {ol.MapOptions} mapOptions Map options.
|
||||
* @return {ol.Collection} Controls.
|
||||
*/
|
||||
ol.Map.createControls_ = function(mapOptions) {
|
||||
@@ -1119,7 +1119,7 @@ ol.Map.createControls_ = function(mapOptions) {
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param {olx.MapOptions} mapOptions Map options.
|
||||
* @param {ol.MapOptions} mapOptions Map options.
|
||||
* @return {ol.Collection} Interactions.
|
||||
*/
|
||||
ol.Map.createInteractions_ = function(mapOptions) {
|
||||
|
||||
@@ -1,20 +1,10 @@
|
||||
goog.provide('ol.overlay.Overlay');
|
||||
goog.provide('ol.overlay.OverlayOptions');
|
||||
goog.provide('ol.overlay.OverlayPositioning');
|
||||
|
||||
goog.require('goog.events');
|
||||
goog.require('goog.style');
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{coordinate: (ol.Coordinate|undefined),
|
||||
* element: (Element|undefined),
|
||||
* map: (ol.Map|undefined),
|
||||
* positioning: (Array.<string>|undefined)}}
|
||||
*/
|
||||
ol.overlay.OverlayOptions;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
|
||||
@@ -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
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
// Create the script tag which includes the derived variables from above
|
||||
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>';
|
||||
|
||||
// this function will fix the links of the result to also include
|
||||
|
||||
Reference in New Issue
Block a user