Ver código fonte

[enh] oscar_template: initial osm-map support for map results

* TODO: remove leaflet.min.css if not required
Thomas Pointhuber 10 anos atrás
pai
commit
740594a4b7

+ 16
- 2
searx/engines/openstreetmap.py Ver arquivo

@@ -15,7 +15,7 @@ categories = ['map']
15 15
 paging = False
16 16
 
17 17
 # search-url
18
-url = 'https://nominatim.openstreetmap.org/search/{query}?format=json'
18
+url = 'https://nominatim.openstreetmap.org/search/{query}?format=json&polygon_geojson=1'
19 19
 
20 20
 result_base_url = 'https://openstreetmap.org/{osm_type}/{osm_id}'
21 21
 
@@ -38,9 +38,23 @@ def response(resp):
38 38
         osm_type = r.get('osm_type', r.get('type'))
39 39
         url = result_base_url.format(osm_type=osm_type,
40 40
                                      osm_id=r['osm_id'])
41
+
42
+        geojson =  r.get('geojson')
43
+
44
+        # if no geojson is found and osm_type is a node, add geojson Point
45
+        if not geojson and\
46
+           osm_type == 'node':
47
+            geojson = {u'type':u'Point', 
48
+                       u'coordinates':[r['lon'],r['lat']]}
49
+
41 50
         # append result
42
-        results.append({'title': title,
51
+        results.append({'template': 'map.html',
52
+                        'title': title,
43 53
                         'content': '',
54
+                        'longitude': r['lon'],
55
+                        'latitude': r['lat'],
56
+                        'boundingbox': r['boundingbox'],
57
+                        'geojson': geojson,
44 58
                         'url': url})
45 59
 
46 60
     # return results

+ 93
- 0
searx/static/oscar/css/leaflet.min.css Ver arquivo

@@ -0,0 +1,93 @@
1
+.leaflet-map-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-pane,.leaflet-tile-container,.leaflet-overlay-pane,.leaflet-shadow-pane,.leaflet-marker-pane,.leaflet-popup-pane,.leaflet-overlay-pane svg,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer{position:absolute;left:0;top:0}
2
+.leaflet-container{overflow:hidden;-ms-touch-action:none}
3
+.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}
4
+.leaflet-marker-icon,.leaflet-marker-shadow{display:block}
5
+.leaflet-container img{max-width:none !important}
6
+.leaflet-container img.leaflet-image-layer{max-width:15000px !important}
7
+.leaflet-tile{filter:inherit;visibility:hidden}
8
+.leaflet-tile-loaded{visibility:inherit}
9
+.leaflet-zoom-box{width:0;height:0}
10
+.leaflet-overlay-pane svg{-moz-user-select:none}
11
+.leaflet-tile-pane{z-index:2}
12
+.leaflet-objects-pane{z-index:3}
13
+.leaflet-overlay-pane{z-index:4}
14
+.leaflet-shadow-pane{z-index:5}
15
+.leaflet-marker-pane{z-index:6}
16
+.leaflet-popup-pane{z-index:7}
17
+.leaflet-vml-shape{width:1px;height:1px}
18
+.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}
19
+.leaflet-control{position:relative;z-index:7;pointer-events:auto}
20
+.leaflet-top,.leaflet-bottom{position:absolute;z-index:1000;pointer-events:none}
21
+.leaflet-top{top:0}
22
+.leaflet-right{right:0}
23
+.leaflet-bottom{bottom:0}
24
+.leaflet-left{left:0}
25
+.leaflet-control{float:left;clear:both}
26
+.leaflet-right .leaflet-control{float:right}
27
+.leaflet-top .leaflet-control{margin-top:10px}
28
+.leaflet-bottom .leaflet-control{margin-bottom:10px}
29
+.leaflet-left .leaflet-control{margin-left:10px}
30
+.leaflet-right .leaflet-control{margin-right:10px}
31
+.leaflet-fade-anim .leaflet-tile,.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;-o-transition:opacity .2s linear;transition:opacity .2s linear}
32
+.leaflet-fade-anim .leaflet-tile-loaded,.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}
33
+.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0, 0, .25, 1);-moz-transition:-moz-transform .25s cubic-bezier(0, 0, .25, 1);-o-transition:-o-transform .25s cubic-bezier(0, 0, .25, 1);transition:transform .25s cubic-bezier(0, 0, .25, 1)}
34
+.leaflet-zoom-anim .leaflet-tile,.leaflet-pan-anim .leaflet-tile,.leaflet-touching .leaflet-zoom-animated{-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}
35
+.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}
36
+.leaflet-clickable{cursor:pointer}
37
+.leaflet-container{cursor:-webkit-grab;cursor:-moz-grab}
38
+.leaflet-popup-pane,.leaflet-control{cursor:auto}
39
+.leaflet-dragging .leaflet-container,.leaflet-dragging .leaflet-clickable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing}
40
+.leaflet-container{background:#ddd;outline:0}
41
+.leaflet-container a{color:#0078a8}
42
+.leaflet-container a.leaflet-active{outline:2px solid #ffa500}
43
+.leaflet-zoom-box{border:2px dotted #38f;background:rgba(255,255,255,0.5)}
44
+.leaflet-container{font:12px/1.5 "Helvetica Neue",Arial,Helvetica,sans-serif}
45
+.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,0.65);border-radius:4px}
46
+.leaflet-bar a,.leaflet-bar a:hover{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}
47
+.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}
48
+.leaflet-bar a:hover{background-color:#f4f4f4}
49
+.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}
50
+.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}
51
+.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}
52
+.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}
53
+.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:bold 18px 'Lucida Console',Monaco,monospace;text-indent:1px}
54
+.leaflet-control-zoom-out{font-size:20px}
55
+.leaflet-touch .leaflet-control-zoom-in{font-size:22px}
56
+.leaflet-touch .leaflet-control-zoom-out{font-size:24px}
57
+.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,0.4);background:#fff;border-radius:5px}
58
+.leaflet-control-layers-toggle{background-image:url(images/layers.png);width:36px;height:36px}
59
+.leaflet-retina .leaflet-control-layers-toggle{background-image:url(images/layers-2x.png);background-size:26px 26px}
60
+.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}
61
+.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}
62
+.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}
63
+.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}
64
+.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}
65
+.leaflet-control-layers label{display:block}
66
+.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}
67
+.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,0.7);margin:0}
68
+.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333}
69
+.leaflet-control-attribution a{text-decoration:none}
70
+.leaflet-control-attribution a:hover{text-decoration:underline}
71
+.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px}
72
+.leaflet-left .leaflet-control-scale{margin-left:5px}
73
+.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}
74
+.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;font-size:11px;white-space:nowrap;overflow:hidden;-moz-box-sizing:content-box;box-sizing:content-box;background:#fff;background:rgba(255,255,255,0.5)}
75
+.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}
76
+.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}
77
+.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{box-shadow:none}
78
+.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{border:2px solid rgba(0,0,0,0.2);background-clip:padding-box}
79
+.leaflet-popup{position:absolute;text-align:center}
80
+.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}
81
+.leaflet-popup-content{margin:13px 19px;line-height:1.4}
82
+.leaflet-popup-content p{margin:18px 0}
83
+.leaflet-popup-tip-container{margin:0 auto;width:40px;height:20px;position:relative;overflow:hidden}
84
+.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}
85
+.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;box-shadow:0 3px 14px rgba(0,0,0,0.4)}
86
+.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;padding:4px 4px 0 0;text-align:center;width:18px;height:14px;font:16px/14px Tahoma,Verdana,sans-serif;color:#c3c3c3;text-decoration:none;font-weight:bold;background:transparent}
87
+.leaflet-container a.leaflet-popup-close-button:hover{color:#999}
88
+.leaflet-popup-scrolled{overflow:auto;border-bottom:1px solid #ddd;border-top:1px solid #ddd}
89
+.leaflet-oldie .leaflet-popup-content-wrapper{zoom:1}
90
+.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)}
91
+.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}
92
+.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}
93
+.leaflet-div-icon{background:#fff;border:1px solid #666}

BIN
searx/static/oscar/img/map/layers-2x.png Ver arquivo


BIN
searx/static/oscar/img/map/layers.png Ver arquivo


BIN
searx/static/oscar/img/map/marker-icon-2x.png Ver arquivo


BIN
searx/static/oscar/img/map/marker-icon.png Ver arquivo


BIN
searx/static/oscar/img/map/marker-shadow.png Ver arquivo


+ 9
- 0
searx/static/oscar/js/leaflet-0.7.3.min.js
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


+ 36
- 0
searx/static/oscar/js/require-2.1.15.min.js Ver arquivo

@@ -0,0 +1,36 @@
1
+/*
2
+ RequireJS 2.1.15 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.
3
+ Available via the MIT or new BSD license.
4
+ see: http://github.com/jrburke/requirejs for details
5
+*/
6
+var requirejs,require,define;
7
+(function(ba){function G(b){return"[object Function]"===K.call(b)}function H(b){return"[object Array]"===K.call(b)}function v(b,c){if(b){var d;for(d=0;d<b.length&&(!b[d]||!c(b[d],d,b));d+=1);}}function T(b,c){if(b){var d;for(d=b.length-1;-1<d&&(!b[d]||!c(b[d],d,b));d-=1);}}function t(b,c){return fa.call(b,c)}function m(b,c){return t(b,c)&&b[c]}function B(b,c){for(var d in b)if(t(b,d)&&c(b[d],d))break}function U(b,c,d,e){c&&B(c,function(c,g){if(d||!t(b,g))e&&"object"===typeof c&&c&&!H(c)&&!G(c)&&!(c instanceof
8
+RegExp)?(b[g]||(b[g]={}),U(b[g],c,d,e)):b[g]=c});return b}function u(b,c){return function(){return c.apply(b,arguments)}}function ca(b){throw b;}function da(b){if(!b)return b;var c=ba;v(b.split("."),function(b){c=c[b]});return c}function C(b,c,d,e){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+b);c.requireType=b;c.requireModules=e;d&&(c.originalError=d);return c}function ga(b){function c(a,k,b){var f,l,c,d,e,g,i,p,k=k&&k.split("/"),h=j.map,n=h&&h["*"];if(a){a=a.split("/");l=a.length-1;j.nodeIdCompat&&
9
+Q.test(a[l])&&(a[l]=a[l].replace(Q,""));"."===a[0].charAt(0)&&k&&(l=k.slice(0,k.length-1),a=l.concat(a));l=a;for(c=0;c<l.length;c++)if(d=l[c],"."===d)l.splice(c,1),c-=1;else if(".."===d&&!(0===c||1==c&&".."===l[2]||".."===l[c-1])&&0<c)l.splice(c-1,2),c-=2;a=a.join("/")}if(b&&h&&(k||n)){l=a.split("/");c=l.length;a:for(;0<c;c-=1){e=l.slice(0,c).join("/");if(k)for(d=k.length;0<d;d-=1)if(b=m(h,k.slice(0,d).join("/")))if(b=m(b,e)){f=b;g=c;break a}!i&&(n&&m(n,e))&&(i=m(n,e),p=c)}!f&&i&&(f=i,g=p);f&&(l.splice(0,
10
+g,f),a=l.join("/"))}return(f=m(j.pkgs,a))?f:a}function d(a){z&&v(document.getElementsByTagName("script"),function(k){if(k.getAttribute("data-requiremodule")===a&&k.getAttribute("data-requirecontext")===i.contextName)return k.parentNode.removeChild(k),!0})}function e(a){var k=m(j.paths,a);if(k&&H(k)&&1<k.length)return k.shift(),i.require.undef(a),i.makeRequire(null,{skipMap:!0})([a]),!0}function n(a){var k,c=a?a.indexOf("!"):-1;-1<c&&(k=a.substring(0,c),a=a.substring(c+1,a.length));return[k,a]}function p(a,
11
+k,b,f){var l,d,e=null,g=k?k.name:null,j=a,p=!0,h="";a||(p=!1,a="_@r"+(K+=1));a=n(a);e=a[0];a=a[1];e&&(e=c(e,g,f),d=m(r,e));a&&(e?h=d&&d.normalize?d.normalize(a,function(a){return c(a,g,f)}):-1===a.indexOf("!")?c(a,g,f):a:(h=c(a,g,f),a=n(h),e=a[0],h=a[1],b=!0,l=i.nameToUrl(h)));b=e&&!d&&!b?"_unnormalized"+(O+=1):"";return{prefix:e,name:h,parentMap:k,unnormalized:!!b,url:l,originalName:j,isDefine:p,id:(e?e+"!"+h:h)+b}}function s(a){var k=a.id,b=m(h,k);b||(b=h[k]=new i.Module(a));return b}function q(a,
12
+k,b){var f=a.id,c=m(h,f);if(t(r,f)&&(!c||c.defineEmitComplete))"defined"===k&&b(r[f]);else if(c=s(a),c.error&&"error"===k)b(c.error);else c.on(k,b)}function w(a,b){var c=a.requireModules,f=!1;if(b)b(a);else if(v(c,function(b){if(b=m(h,b))b.error=a,b.events.error&&(f=!0,b.emit("error",a))}),!f)g.onError(a)}function x(){R.length&&(ha.apply(A,[A.length,0].concat(R)),R=[])}function y(a){delete h[a];delete V[a]}function F(a,b,c){var f=a.map.id;a.error?a.emit("error",a.error):(b[f]=!0,v(a.depMaps,function(f,
13
+d){var e=f.id,g=m(h,e);g&&(!a.depMatched[d]&&!c[e])&&(m(b,e)?(a.defineDep(d,r[e]),a.check()):F(g,b,c))}),c[f]=!0)}function D(){var a,b,c=(a=1E3*j.waitSeconds)&&i.startTime+a<(new Date).getTime(),f=[],l=[],g=!1,h=!0;if(!W){W=!0;B(V,function(a){var i=a.map,j=i.id;if(a.enabled&&(i.isDefine||l.push(a),!a.error))if(!a.inited&&c)e(j)?g=b=!0:(f.push(j),d(j));else if(!a.inited&&(a.fetched&&i.isDefine)&&(g=!0,!i.prefix))return h=!1});if(c&&f.length)return a=C("timeout","Load timeout for modules: "+f,null,
14
+f),a.contextName=i.contextName,w(a);h&&v(l,function(a){F(a,{},{})});if((!c||b)&&g)if((z||ea)&&!X)X=setTimeout(function(){X=0;D()},50);W=!1}}function E(a){t(r,a[0])||s(p(a[0],null,!0)).init(a[1],a[2])}function I(a){var a=a.currentTarget||a.srcElement,b=i.onScriptLoad;a.detachEvent&&!Y?a.detachEvent("onreadystatechange",b):a.removeEventListener("load",b,!1);b=i.onScriptError;(!a.detachEvent||Y)&&a.removeEventListener("error",b,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}function J(){var a;
15
+for(x();A.length;){a=A.shift();if(null===a[0])return w(C("mismatch","Mismatched anonymous define() module: "+a[a.length-1]));E(a)}}var W,Z,i,L,X,j={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},h={},V={},$={},A=[],r={},S={},aa={},K=1,O=1;L={require:function(a){return a.require?a.require:a.require=i.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?r[a.map.id]=a.exports:a.exports=r[a.map.id]={}},module:function(a){return a.module?
16
+a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){return m(j.config,a.map.id)||{}},exports:a.exports||(a.exports={})}}};Z=function(a){this.events=m($,a.id)||{};this.map=a;this.shim=m(j.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};Z.prototype={init:function(a,b,c,f){f=f||{};if(!this.inited){this.factory=b;if(c)this.on("error",c);else this.events.error&&(c=u(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.errback=
17
+c;this.inited=!0;this.ignore=f.ignore;f.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=b)},fetch:function(){if(!this.fetched){this.fetched=!0;i.startTime=(new Date).getTime();var a=this.map;if(this.shim)i.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],u(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=
18
+this.map.url;S[a]||(S[a]=!0,i.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,b,c=this.map.id;b=this.depExports;var f=this.exports,l=this.factory;if(this.inited)if(this.error)this.emit("error",this.error);else{if(!this.defining){this.defining=!0;if(1>this.depCount&&!this.defined){if(G(l)){if(this.events.error&&this.map.isDefine||g.onError!==ca)try{f=i.execCb(c,l,b,f)}catch(d){a=d}else f=i.execCb(c,l,b,f);this.map.isDefine&&void 0===f&&((b=this.module)?f=b.exports:this.usingExports&&
19
+(f=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else f=l;this.exports=f;if(this.map.isDefine&&!this.ignore&&(r[c]=f,g.onResourceLoad))g.onResourceLoad(i,this.map,this.depMaps);y(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a=
20
+this.map,b=a.id,d=p(a.prefix);this.depMaps.push(d);q(d,"defined",u(this,function(f){var l,d;d=m(aa,this.map.id);var e=this.map.name,P=this.map.parentMap?this.map.parentMap.name:null,n=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(e=f.normalize(e,function(a){return c(a,P,!0)})||""),f=p(a.prefix+"!"+e,this.map.parentMap),q(f,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=m(h,f.id)){this.depMaps.push(f);
21
+if(this.events.error)d.on("error",u(this,function(a){this.emit("error",a)}));d.enable()}}else d?(this.map.url=i.nameToUrl(d),this.load()):(l=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),l.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(h,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),l.fromText=u(this,function(f,c){var d=a.name,e=p(d),P=M;c&&(f=c);P&&(M=!1);s(e);t(j.config,b)&&(j.config[d]=j.config[b]);try{g.exec(f)}catch(h){return w(C("fromtexteval",
22
+"fromText eval for "+b+" failed: "+h,h,[b]))}P&&(M=!0);this.depMaps.push(e);i.completeLoad(d);n([d],l)}),f.load(a.name,n,l,j))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){V[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,u(this,function(a,b){var c,f;if("string"===typeof a){a=p(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=m(L,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;q(a,"defined",u(this,function(a){this.defineDep(b,
23
+a);this.check()}));this.errback&&q(a,"error",u(this,this.errback))}c=a.id;f=h[c];!t(L,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,u(this,function(a){var b=m(h,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){v(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:j,contextName:b,registry:h,defined:r,urlFetched:S,defQueue:A,Module:Z,makeModuleMap:p,
24
+nextTick:g.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=j.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(j[b]||(j[b]={}),U(j[b],a,!0,!0)):j[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(aa[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);b[c]=a}),j.shim=b);a.packages&&v(a.packages,function(a){var b,
25
+a="string"===typeof a?{name:a}:a;b=a.name;a.location&&(j.paths[b]=a.location);j.pkgs[b]=a.name+"/"+(a.main||"main").replace(ia,"").replace(Q,"")});B(h,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=p(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ba,arguments));return b||a.exports&&da(a.exports)}},makeRequire:function(a,e){function j(c,d,m){var n,q;e.enableBuildCallback&&(d&&G(d))&&(d.__requireJsBuild=
26
+!0);if("string"===typeof c){if(G(d))return w(C("requireargs","Invalid require call"),m);if(a&&t(L,c))return L[c](h[a.id]);if(g.get)return g.get(i,c,a,j);n=p(c,a,!1,!0);n=n.id;return!t(r,n)?w(C("notloaded",'Module name "'+n+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[n]}J();i.nextTick(function(){J();q=s(p(null,a));q.skipMap=e.skipMap;q.init(c,d,m,{enabled:!0});D()});return j}e=e||{};U(j,{isBrowser:z,toUrl:function(b){var d,e=b.lastIndexOf("."),k=b.split("/")[0];if(-1!==
27
+e&&(!("."===k||".."===k)||1<e))d=b.substring(e,b.length),b=b.substring(0,e);return i.nameToUrl(c(b,a&&a.id,!0),d,!0)},defined:function(b){return t(r,p(b,a,!1,!0).id)},specified:function(b){b=p(b,a,!1,!0).id;return t(r,b)||t(h,b)}});a||(j.undef=function(b){x();var c=p(b,a,!0),e=m(h,b);d(b);delete r[b];delete S[c.url];delete $[b];T(A,function(a,c){a[0]===b&&A.splice(c,1)});e&&(e.events.defined&&($[b]=e.events),y(b))});return j},enable:function(a){m(h,a.id)&&s(a).enable()},completeLoad:function(a){var b,
28
+c,d=m(j.shim,a)||{},g=d.exports;for(x();A.length;){c=A.shift();if(null===c[0]){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);E(c)}c=m(h,a);if(!b&&!t(r,a)&&c&&!c.inited){if(j.enforceDefine&&(!g||!da(g)))return e(a)?void 0:w(C("nodefine","No define call for "+a,null,[a]));E([a,d.deps||[],d.exportsFn])}D()},nameToUrl:function(a,b,c){var d,e,h;(d=m(j.pkgs,a))&&(a=d);if(d=m(aa,a))return i.nameToUrl(d,b,c);if(g.jsExtRegExp.test(a))d=a+(b||"");else{d=j.paths;a=a.split("/");for(e=a.length;0<e;e-=1)if(h=a.slice(0,
29
+e).join("/"),h=m(d,h)){H(h)&&(h=h[0]);a.splice(0,e,h);break}d=a.join("/");d+=b||(/^data\:|\?/.test(d)||c?"":".js");d=("/"===d.charAt(0)||d.match(/^[\w\+\.\-]+:/)?"":j.baseUrl)+d}return j.urlArgs?d+((-1===d.indexOf("?")?"?":"&")+j.urlArgs):d},load:function(a,b){g.load(i,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if("load"===a.type||ja.test((a.currentTarget||a.srcElement).readyState))N=null,a=I(a),i.completeLoad(a.id)},onScriptError:function(a){var b=I(a);if(!e(b.id))return w(C("scripterror",
30
+"Script error for: "+b.id,a,[b.id]))}};i.require=i.makeRequire();return i}var g,x,y,D,I,E,N,J,s,O,ka=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,la=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,Q=/\.js$/,ia=/^\.\//;x=Object.prototype;var K=x.toString,fa=x.hasOwnProperty,ha=Array.prototype.splice,z=!!("undefined"!==typeof window&&"undefined"!==typeof navigator&&window.document),ea=!z&&"undefined"!==typeof importScripts,ja=z&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,
31
+Y="undefined"!==typeof opera&&"[object Opera]"===opera.toString(),F={},q={},R=[],M=!1;if("undefined"===typeof define){if("undefined"!==typeof requirejs){if(G(requirejs))return;q=requirejs;requirejs=void 0}"undefined"!==typeof require&&!G(require)&&(q=require,require=void 0);g=requirejs=function(b,c,d,e){var n,p="_";!H(b)&&"string"!==typeof b&&(n=b,H(c)?(b=c,c=d,d=e):b=[]);n&&n.context&&(p=n.context);(e=m(F,p))||(e=F[p]=g.s.newContext(p));n&&e.configure(n);return e.require(b,c,d)};g.config=function(b){return g(b)};
32
+g.nextTick="undefined"!==typeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=g);g.version="2.1.15";g.jsExtRegExp=/^\/|:|\?|\.js$/;g.isBrowser=z;x=g.s={contexts:F,newContext:ga};g({});v(["toUrl","undef","defined","specified"],function(b){g[b]=function(){var c=F._;return c.require[b].apply(c,arguments)}});if(z&&(y=x.head=document.getElementsByTagName("head")[0],D=document.getElementsByTagName("base")[0]))y=x.head=D.parentNode;g.onError=ca;g.createNode=function(b){var c=
33
+b.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");c.type=b.scriptType||"text/javascript";c.charset="utf-8";c.async=!0;return c};g.load=function(b,c,d){var e=b&&b.config||{};if(z)return e=g.createNode(e,c,d),e.setAttribute("data-requirecontext",b.contextName),e.setAttribute("data-requiremodule",c),e.attachEvent&&!(e.attachEvent.toString&&0>e.attachEvent.toString().indexOf("[native code"))&&!Y?(M=!0,e.attachEvent("onreadystatechange",b.onScriptLoad)):
34
+(e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)),e.src=d,J=e,D?y.insertBefore(e,D):y.appendChild(e),J=null,e;if(ea)try{importScripts(d),b.completeLoad(c)}catch(m){b.onError(C("importscripts","importScripts failed for "+c+" at "+d,m,[c]))}};z&&!q.skipDataMain&&T(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(I=b.getAttribute("data-main"))return s=I,q.baseUrl||(E=s.split("/"),s=E.pop(),O=E.length?E.join("/")+"/":"./",q.baseUrl=
35
+O),s=s.replace(Q,""),g.jsExtRegExp.test(s)&&(s=I),q.deps=q.deps?q.deps.concat(s):[s],!0});define=function(b,c,d){var e,g;"string"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(ka,"").replace(la,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(M){if(!(e=J))N&&"interactive"===N.readyState||T(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return N=b}),e=N;e&&(b||
36
+(b=e.getAttribute("data-requiremodule")),g=F[e.getAttribute("data-requirecontext")])}(g?g.defQueue:R).push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(q)}})(this);

+ 59
- 0
searx/static/oscar/js/scripts.js Ver arquivo

@@ -7,6 +7,13 @@
7 7
 
8 8
 */
9 9
 
10
+requirejs.config({
11
+baseUrl: '/static/oscar/js',
12
+paths: {
13
+app: '../app'
14
+}
15
+});
16
+
10 17
 if(searx.autocompleter) {
11 18
     searx.searchResults = new Bloodhound({
12 19
         datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
@@ -61,4 +68,56 @@ $(document).ready(function(){
61 68
             source: searx.searchResults.ttAdapter()
62 69
         });
63 70
     }
71
+
72
+    $(".searx_init_map").on( "click", function( event ) {
73
+        var leaflet_target = $(this).data('leaflet-target');
74
+        var map_lon = $(this).data('map-lon');
75
+        var map_lat = $(this).data('map-lat');
76
+        var map_zoom = $(this).data('map-zoom');
77
+        var map_boundingbox = $(this).data('map-boundingbox');
78
+        var map_geojson = $(this).data('map-geojson');
79
+  
80
+        require(['leaflet-0.7.3.min'], function(leaflet) {
81
+            if(map_boundingbox) {
82
+                var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]),
83
+                    northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]),
84
+                    map_bounds = L.latLngBounds(southWest, northEast);
85
+            }
86
+
87
+            // TODO hack
88
+            // change default imagePath
89
+            L.Icon.Default.imagePath = 	"/static/oscar/img/map";
90
+
91
+            // init map
92
+            var map = L.map(leaflet_target);
93
+
94
+            // create the tile layer with correct attribution
95
+	        var osmUrl='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
96
+	        var osmAttrib='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';
97
+	        var osm = new L.TileLayer(osmUrl, {minZoom: 1, maxZoom: 19, attribution: osmAttrib});		
98
+
99
+            // init map view
100
+            if(map_bounds) {
101
+                // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021
102
+                setTimeout(function () {
103
+                    map.fitBounds(map_bounds);
104
+                }, 0);
105
+            } else if (map_lon && map_lat) {
106
+                if(map_zoom) 
107
+                    map.setView(new L.LatLng(map_lat, map_lon),map_zoom);
108
+                else
109
+                    map.setView(new L.LatLng(map_lat, map_lon),8);
110
+            }
111
+
112
+	        map.addLayer(osm);
113
+
114
+            if(map_geojson)
115
+                L.geoJson(map_geojson).addTo(map);
116
+	        //if(map_bounds)
117
+	        //    L.rectangle(map_bounds, {color: "#ff7800", weight: 3, fill:false}).addTo(map);
118
+        });
119
+
120
+        // this event occour only once per element
121
+        $( this ).off( event );
122
+    });
64 123
 });  

+ 13
- 0
searx/templates/courgette/result_templates/map.html Ver arquivo

@@ -0,0 +1,13 @@
1
+<div class="result {{ result.class }}">
2
+
3
+  {% if result['favicon'] %}
4
+    <img width="14" height="14" class="favicon" src="static/{{theme}}/img/icon_{{result['favicon']}}.ico" />
5
+  {% endif %}
6
+
7
+  <div>
8
+    <h3 class="result_title"><a href="{{ result.url }}">{{ result.title|safe }}</a></h3>
9
+	{% if result.publishedDate %}<p class="published_date">{{ result.publishedDate }}</p>{% endif %}
10
+    <p class="content">{% if result.content %}{{ result.content|safe }}<br />{% endif %}</p>
11
+    <p class="url">{{ result.pretty_url }}</p>
12
+  </div>
13
+</div>

+ 13
- 0
searx/templates/default/result_templates/map.html Ver arquivo

@@ -0,0 +1,13 @@
1
+<div class="result {{ result.class }}">
2
+
3
+  {% if result['favicon'] %}
4
+    <img width="14" height="14" class="favicon" src="static/{{theme}}/img/icon_{{result['favicon']}}.ico" />
5
+  {% endif %}
6
+
7
+  <div>
8
+    <h3 class="result_title"><a href="{{ result.url }}">{{ result.title|safe }}</a></h3>
9
+    <p class="url">{{ result.pretty_url }} <a class="cache_link" href="https://web.archive.org/web/{{ result.url }}">cached</a></p>
10
+	{% if result.publishedDate %}<p class="published_date">{{ result.publishedDate }}</p>{% endif %}
11
+    <p class="content">{% if result.img_src %}<img src="{{ result.img_src }}" class="image" />{% endif %}{% if result.content %}{{ result.content|safe }}<br class="last"/>{% endif %}</p>
12
+  </div>
13
+</div>

+ 4
- 2
searx/templates/oscar/base.html Ver arquivo

@@ -10,7 +10,8 @@
10 10
     
11 11
     <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}" type="text/css" />
12 12
     <link rel="stylesheet" href="{{ url_for('static', filename='css/oscar.min.css') }}" type="text/css" />  
13
-    
13
+    <link rel="stylesheet" href="{{ url_for('static', filename='css/leaflet.min.css') }}" type="text/css" />
14
+
14 15
     <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
15 16
     <!--[if lt IE 9]>
16 17
       <script src="{{ url_for('static', filename='js/html5shiv.min.js') }}"></script>
@@ -64,6 +65,7 @@
64 65
     <script src="{{ url_for('static', filename='js/jquery-1.11.1.min.js') }}"></script>
65 66
     <script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script>
66 67
     {% if autocomplete %}<script src="{{ url_for('static', filename='js/typeahead.bundle.min.js') }}"></script>{% endif %}
67
-    <script src="{{ url_for('static', filename='js/scripts.js') }}"></script>
68
+    <script src="{{ url_for('static', filename='js/require-2.1.15.min.js') }}"></script>
69
+    <script src="{{ url_for('static', filename='js/scripts.js') }}"></script>-->
68 70
 </body>
69 71
 </html>

+ 2
- 0
searx/templates/oscar/result_templates/default.html Ver arquivo

@@ -4,5 +4,7 @@
4 4
 
5 5
 {% if result.content %}<p>{{ result.content|safe }}</p>{% endif %}
6 6
 
7
+<div class="clearfix"></div>
8
+
7 9
 <span class="label label-default pull-right">{{ result.engine }}</span>
8 10
 <p class="text-muted">{{ result.pretty_url }}</p>

+ 1
- 0
searx/templates/oscar/result_templates/images.html Ver arquivo

@@ -14,6 +14,7 @@
14 14
                 {% if result.content %}<p>{{ result.content|safe }}</p>{% endif %}
15 15
             </div>
16 16
             <div class="modal-footer">
17
+                <div class="clearfix"></div>
17 18
                 <span class="label label-default pull-right">{{ result.engine }}</span>
18 19
                 <p class="text-muted pull-left">{{ result.pretty_url }}</p>
19 20
                 <div class="clearfix"></div>

+ 18
- 0
searx/templates/oscar/result_templates/map.html Ver arquivo

@@ -0,0 +1,18 @@
1
+<h3>{% if result['favicon'] %}<img width="32" height="32" class="favicon" src="static/{{ theme }}/img/icons/{{ result['favicon'] }}.png" /> {% endif %}<a href="{{ result.url }}">{{ result.title|safe }}</a></h3>
2
+
3
+{% if result.publishedDate %}<time class="text-muted" datetime="{{ result.publishedDate }}" pubdate>{{ result.publishedDate }}</time>{% endif %}
4
+
5
+{% if result.content %}<p>{{ result.content|safe }}</p>{% endif %}
6
+
7
+{% if result.latitude and result.longitude %}
8
+    <button type="button" class="btn btn-default btn-collapse collapsed searx_init_map" data-toggle="collapse" data-target="#result-map-{{ index }}" data-leaflet-target="osm-map-{{ index }}" data-map-lon="{{ result.longitude }}" data-map-lat="{{ result.latitude }}" {% if result.boundingbox %}data-map-boundingbox='{{ result.boundingbox|tojson|safe }}'{% endif %} {% if result.geojson %}data-map-geojson='{{ result.geojson|tojson|safe }}'{% endif %} data-btn-text-collapsed="{{ _('Show Map') }}" data-btn-text-not-collapsed="{{ _('Hide Map') }}">{{ _('Show Map') }}</button>
9
+
10
+    <div class="collapse" id="result-map-{{ index }}">
11
+        <div style="height:300px; width:100%; margin: 10px 0;" id="osm-map-{{ index }}"></div>
12
+    </div>
13
+{% endif %}
14
+
15
+<div class="clearfix"></div>
16
+
17
+<span class="label label-default pull-right">{{ result.engine }}</span>
18
+<p class="text-muted">{{ result.pretty_url }}</p>

+ 2
- 0
searx/templates/oscar/result_templates/torrent.html Ver arquivo

@@ -10,5 +10,7 @@
10 10
 
11 11
 {% if result.content %}<p>{{ result.content|safe }}</p>{% endif %}
12 12
 
13
+<div class="clearfix"></div>
14
+
13 15
 <span class="label label-default pull-right">{{ result.engine }}</span>
14 16
 <p class="text-muted">{{ result.pretty_url }}</p>

+ 2
- 0
searx/templates/oscar/result_templates/videos.html Ver arquivo

@@ -9,5 +9,7 @@
9 9
     </div>
10 10
 </div>
11 11
 
12
+<div class="clearfix"></div>
13
+
12 14
 <span class="label label-default pull-right">{{ result.engine }}</span>
13 15
 <p class="text-muted">{{ result.pretty_url }}</p>