diff --git a/dist/app.js b/dist/app.js
index 90264aa..920268a 100644
--- a/dist/app.js
+++ b/dist/app.js
@@ -4483,7 +4483,7 @@ var app = (function (exports) {
seconds = date.getUTCSeconds(),
milliseconds = date.getUTCMilliseconds();
return isNaN(date) ? "Invalid Date"
- : formatYear(date.getUTCFullYear(), 4) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2)
+ : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2)
+ (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z"
: seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z"
: minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z"
@@ -5169,7 +5169,8 @@ var app = (function (exports) {
constructor (opts) {
var width = 600,
height = 600;
-
+ this.width = width;
+ this.height = height;
this.zoom_level = opts.zoom || 1.5;
this.apiurl = opts.apiurl;
this.categorylabel = opts.categorylabel || "Category";
@@ -5244,10 +5245,31 @@ var app = (function (exports) {
});
cat.append("span").attr("class", "count").html(d => d.tcount);
+ var set_active_url_from_window = () => {
+ var title = this.wiki.unescapeTitle(window.location.hash.substring(1)),
+ page = this.wiki.get_page_by_title(title),
+ url = page.url();
+ console.log("wikimap init", page.title, url);
+ this.set_active_url(url);
+ };
+
this.loaded = true;
- if (this.active_url) {
+ if (window.location.hash) {
+ set_active_url_from_window();
+ } else if (this.active_url) {
this.set_active_url(this.active_url);
}
+
+ window.addEventListener("hashchange", e => {
+ console.log("hashchange");
+ set_active_url_from_window();
+ });
+ /*
+ window.addEventListener("popstate", e => {
+ // console.log("popstate", e);
+ console.log("popstate: " + document.location + ", state: " + JSON.stringify(e.state));
+ })
+ */
}
on (message, callback, context) {
@@ -5279,10 +5301,20 @@ var app = (function (exports) {
.attr("class", "links");
this.nodesg = this.content.append("g")
.attr("class", "nodes");
+
+ // DEBUGGING
+ this.svg.on("click", x => {
+ // console.log("svg click", event.target);
+ if (event.target == this.svg.node()) {
+ console.log("(debug) BACKGROUND CLICK", this.active_page.x, this.active_page.y);
+ this.centerOnItem(this.active_page);
+ }
+ });
}
dragstarted (d) {
- // if (!event.active) this.simulation.alphaTarget(0.3).restart();
+ if (!event.active) this.simulation.alphaTarget(0.3).restart();
+ // this.simulation.restart();
d.fx = d.x;
d.fy = d.y;
}
@@ -5293,7 +5325,7 @@ var app = (function (exports) {
}
dragended(d) {
- // if (!event.active) this.simulation.alphaTarget(0);
+ if (!event.active) this.simulation.alphaTarget(0);
d.fx = null;
d.fy = null;
}
@@ -5322,11 +5354,16 @@ var app = (function (exports) {
return ret;
}
+ // function called on iframe load
async set_active_url (url) {
- this.active_url = url;
+ console.log("wikimap.set_active_url", url);
+ this.active_url = url;
if (this.loaded) {
var page = this.wiki.get_page(this.active_url);
if (page) {
+ // console.log("calling replaceState", page.title);
+ window.history.replaceState (null, null, "#"+this.wiki.escapeTitle(page.title));
+ // window.location.hash = this.wiki.escapeTitle(page.title);
this.set_active_page(page);
} else {
console.log("wikimap: set_active_url: NO PAGE FOR", url);
@@ -5378,9 +5415,12 @@ var app = (function (exports) {
// console.log("page is already the active page", page, this.active_page);
return;
}
-
+ // window.location.hash = this.wiki.escapeTitle(page.title);
+ // window.history.pushState ({pagetitle: page.title}, page.title, "/m/"+this.wiki.escapeTitle(page.title));
// cleanup old
if (this.active_page) {
+ this.active_page.fx = undefined;
+ this.active_page.fy = undefined;
this.active_page.active = false;
// deactivate linked links/nodes
this.linked_nodes_set_active(this.active_page, false);
@@ -5421,10 +5461,10 @@ var app = (function (exports) {
// LOAD/ENSURE PAGE LINKS
var links_out = await page.get_links();
links_out = links_out.filter(p => (!p.redirect && p.ns == 0));
- console.log("links_out", links_out);
+ // console.log("links_out", links_out);
var links_in = await page.get_linkshere();
links_in = links_in.filter(p => (!p.redirect && p.ns == 0));
- console.log("links_in", links_in);
+ // console.log("links_in", links_in);
links_out.forEach(p => {
this.ensure_link(page, p).wiki = true;
});
@@ -5435,12 +5475,19 @@ var app = (function (exports) {
}
this.active_page = page;
+ // console.log("fixing active page", this.active_page);
+ if (this.active_page.x === undefined) {
+ this.active_page.x = this.width/2;
+ this.active_page.y = this.height/2;
+ }
+ this.active_page.fx = this.active_page.x;
+ this.active_page.fy = this.active_page.y;
this.active_page.active = true;
this.linked_nodes_set_active(this.active_page, true);
- setTimeout(() => {
- this.centerOnItem(page, 1000);
- }, 1000);
+ //setTimeout(() => {
+ this.centerOnItem(page, 1000);
+ //}, 1000);
this.events.emit("page", this.active_page);
var data = {nodes: this.get_nodes(), links: values(this.all_links_by_key)};
@@ -5497,7 +5544,7 @@ var app = (function (exports) {
}
update_graph (graph) {
- console.log("UPDATE GRAPH", graph.nodes.length, graph.links.length);
+ // console.log("UPDATE GRAPH", graph.nodes.length, graph.links.length);
var link = this.linksg.selectAll("line")
.data(graph.links, d => { return this.link_key(d.source.title, d.target.title) });
var link_enter = link.enter()
@@ -5528,11 +5575,15 @@ var app = (function (exports) {
})
.on("mouseover", function (d) {
// console.log("mouseover", this);
+ // d.mouse = true;
select(this).classed("mouse", true);
+ // that.update_nodes();
})
.on("mouseout", function (d) {
// console.log("mouseout", this);
+ // d.mouse = false;
select(this).classed("mouse", false);
+ // that.update_nodes();
})
.call(drag()
.on("start", this.dragstarted.bind(this))
@@ -5603,13 +5654,14 @@ var app = (function (exports) {
update_nodes () {
var nodes = this.nodesg.selectAll("g.page");
// console.log("update_nodes", nodes.size());
+ nodes.classed("mouse", d=>d.mouse);
nodes.classed("active", d=>d.active);
nodes.classed("active2", d=>d.active2);
nodes.classed("highlight", d=>d.highlight);
nodes.sort((a, b) => {
// console.log("sort", a, b);
- var x = a.active ? 10 : (a.active2 ? 5 : 0),
- y = b.active ? 10 : (b.active2 ? 5 : 0);
+ var x = a.mouse ? 10 : (a.active ? 8 : (a.active2 ? 5 : 0)),
+ y = b.mouse ? 10 : (b.active ? 8 : (b.active2 ? 5 : 0));
return x - y;
});
var links = this.linksg.selectAll("line");
@@ -5641,20 +5693,24 @@ var app = (function (exports) {
centerOnItem(item, duration) {
var bounds = this.svg.node().getBoundingClientRect();
var curt = transform(this.rect.node());
- console.log("centerOnItem", this.zoom_level, "item", item);
+ // console.log("centerOnItem", this.zoom_level, "item", item);
var zoom_level = this.zoom_level ? this.zoom_level : curt.k;
if (item && item.x !== undefined) {
- var transform$1 = function () {
- return identity$1
+ this.zoom.translateTo(duration ? this.rect.transition().duration(duration) : this.rect, item.x, item.y);
+ // this.zoom.translateTo(this.rect, item.x, item.y);
+ /*
+ var transform = function () {
+ return zoomIdentity
.translate(bounds.width / 2, bounds.height / 2)
.scale(zoom_level)
.translate(-item.x, -item.y);
};
if (duration) {
- this.rect.transition().duration(duration).call(this.zoom.transform, transform$1);
+ this.rect.transition().duration(duration).call(this.zoom.transform, transform);
} else {
- this.rect.call(this.zoom.transform, transform$1);
+ this.rect.call(this.zoom.transform, transform);
}
+ */
} else {
console.log("NO ITEM");
var transform$1 = function () {
diff --git a/dist/index.js b/dist/index.js
index 6f1ddf8..04ec175 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -58,4 +58,51 @@ iframe.addEventListener("load", function () {
cats.addEventListener("click", e => {
cats.classList.toggle("expanded");
-})
\ No newline at end of file
+});
+
+var specialselect = document.querySelector("select#special"),
+ // specialselectdiv = document.getElementById("specialselectdiv"),
+ specialiframediv = document.getElementById("specialiframediv"),
+ specialiframe = null,
+ specialsrc = null,
+ specialclosediv = document.getElementById("specialclosediv"),
+ specialclosebutton = document.getElementById("specialclosebutton");
+
+function set_special (v) {
+ if (specialsrc !== v) {
+ specialsrc = v;
+ specialselect.value = v;
+ if (specialsrc !== "") {
+ if (specialiframe == null) {
+ //
+ specialiframe = document.createElement('iframe');
+ specialiframediv.appendChild(specialiframe);
+ }
+ // console.log("specialiframe.src", specialiframe.src)
+ if (specialiframe.getAttribute("src") != specialsrc) {
+ console.log("setAttribute iframe src", specialsrc);
+ specialiframe.setAttribute("src", specialsrc);
+ }
+ specialiframediv.style.display = "block";
+ specialclosediv.style.display = "block";
+ } else {
+ // show map
+ // if (specialiframe) {
+ // specialiframe.src = "";
+ // specialiframediv.removeChild(specialiframe);
+ // specialiframe = null;
+ // }
+ specialiframediv.style.display = "none";
+ specialclosediv.style.display = "none";
+ }
+ }
+}
+set_special(specialselect.value);
+specialclosebutton.addEventListener("click", function (e) {
+ e.preventDefault();
+ set_special("");
+});
+specialselect.addEventListener("input", function (e) {
+ console.log("specialselect", specialselect.value);
+ set_special(specialselect.value);
+});
\ No newline at end of file
diff --git a/img/Ateliers_pluridisciplinaires.png b/img/Ateliers_pluridisciplinaires.png
index 7af95f0..5c69cfe 100644
Binary files a/img/Ateliers_pluridisciplinaires.png and b/img/Ateliers_pluridisciplinaires.png differ
diff --git a/img/Cours_de_soutien_specifique.png b/img/Cours_de_soutien_specifique.png
index 7a245ef..e2d7ce0 100644
Binary files a/img/Cours_de_soutien_specifique.png and b/img/Cours_de_soutien_specifique.png differ
diff --git a/img/Cours_techniques.png b/img/Cours_techniques.png
index faec804..0d6fd94 100644
Binary files a/img/Cours_techniques.png and b/img/Cours_techniques.png differ
diff --git a/img/Cours_theoriques.png b/img/Cours_theoriques.png
index b99f05a..33cae76 100644
Binary files a/img/Cours_theoriques.png and b/img/Cours_theoriques.png differ
diff --git a/img/Enseignants.png b/img/Enseignants.png
index db5458d..ab1b4ae 100644
Binary files a/img/Enseignants.png and b/img/Enseignants.png differ
diff --git a/img/Main.png b/img/Main.png
index 6e68397..7918b52 100644
Binary files a/img/Main.png and b/img/Main.png differ
diff --git a/img/Orientations.png b/img/Orientations.png
index b3a65e4..aa13c16 100644
Binary files a/img/Orientations.png and b/img/Orientations.png differ
diff --git a/index.html b/index.html
index f242c7a..2ee469f 100644
--- a/index.html
+++ b/index.html
@@ -18,12 +18,22 @@
+
+
+
+
+
-
+
diff --git a/special/recentfiles/Makefile b/special/recentfiles/Makefile
new file mode 100644
index 0000000..1b03c31
--- /dev/null
+++ b/special/recentfiles/Makefile
@@ -0,0 +1,6 @@
+
+all: dist/app.js
+
+dist/app.js: src/*.js
+ # node_modules/.bin/rollup src/index.js --file dist/index.js --format iife
+ node_modules/.bin/rollup -c
diff --git a/special/recentfiles/dist/recentfiles.js b/special/recentfiles/dist/recentfiles.js
new file mode 100644
index 0000000..7100e62
--- /dev/null
+++ b/special/recentfiles/dist/recentfiles.js
@@ -0,0 +1,942 @@
+(function () {
+ 'use strict';
+
+ var xhtml = "http://www.w3.org/1999/xhtml";
+
+ var namespaces = {
+ svg: "http://www.w3.org/2000/svg",
+ xhtml: xhtml,
+ xlink: "http://www.w3.org/1999/xlink",
+ xml: "http://www.w3.org/XML/1998/namespace",
+ xmlns: "http://www.w3.org/2000/xmlns/"
+ };
+
+ function namespace(name) {
+ var prefix = name += "", i = prefix.indexOf(":");
+ if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
+ return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
+ }
+
+ function creatorInherit(name) {
+ return function() {
+ var document = this.ownerDocument,
+ uri = this.namespaceURI;
+ return uri === xhtml && document.documentElement.namespaceURI === xhtml
+ ? document.createElement(name)
+ : document.createElementNS(uri, name);
+ };
+ }
+
+ function creatorFixed(fullname) {
+ return function() {
+ return this.ownerDocument.createElementNS(fullname.space, fullname.local);
+ };
+ }
+
+ function creator(name) {
+ var fullname = namespace(name);
+ return (fullname.local
+ ? creatorFixed
+ : creatorInherit)(fullname);
+ }
+
+ function none() {}
+
+ function selector(selector) {
+ return selector == null ? none : function() {
+ return this.querySelector(selector);
+ };
+ }
+
+ function selection_select(select) {
+ if (typeof select !== "function") select = selector(select);
+
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
+ if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
+ if ("__data__" in node) subnode.__data__ = node.__data__;
+ subgroup[i] = subnode;
+ }
+ }
+ }
+
+ return new Selection(subgroups, this._parents);
+ }
+
+ function empty() {
+ return [];
+ }
+
+ function selectorAll(selector) {
+ return selector == null ? empty : function() {
+ return this.querySelectorAll(selector);
+ };
+ }
+
+ function selection_selectAll(select) {
+ if (typeof select !== "function") select = selectorAll(select);
+
+ for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+ if (node = group[i]) {
+ subgroups.push(select.call(node, node.__data__, i, group));
+ parents.push(node);
+ }
+ }
+ }
+
+ return new Selection(subgroups, parents);
+ }
+
+ function matcher(selector) {
+ return function() {
+ return this.matches(selector);
+ };
+ }
+
+ function selection_filter(match) {
+ if (typeof match !== "function") match = matcher(match);
+
+ for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
+ if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
+ subgroup.push(node);
+ }
+ }
+ }
+
+ return new Selection(subgroups, this._parents);
+ }
+
+ function sparse(update) {
+ return new Array(update.length);
+ }
+
+ function selection_enter() {
+ return new Selection(this._enter || this._groups.map(sparse), this._parents);
+ }
+
+ function EnterNode(parent, datum) {
+ this.ownerDocument = parent.ownerDocument;
+ this.namespaceURI = parent.namespaceURI;
+ this._next = null;
+ this._parent = parent;
+ this.__data__ = datum;
+ }
+
+ EnterNode.prototype = {
+ constructor: EnterNode,
+ appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
+ insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
+ querySelector: function(selector) { return this._parent.querySelector(selector); },
+ querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
+ };
+
+ function constant(x) {
+ return function() {
+ return x;
+ };
+ }
+
+ var keyPrefix = "$"; // Protect against keys like “__proto__”.
+
+ function bindIndex(parent, group, enter, update, exit, data) {
+ var i = 0,
+ node,
+ groupLength = group.length,
+ dataLength = data.length;
+
+ // Put any non-null nodes that fit into update.
+ // Put any null nodes into enter.
+ // Put any remaining data into enter.
+ for (; i < dataLength; ++i) {
+ if (node = group[i]) {
+ node.__data__ = data[i];
+ update[i] = node;
+ } else {
+ enter[i] = new EnterNode(parent, data[i]);
+ }
+ }
+
+ // Put any non-null nodes that don’t fit into exit.
+ for (; i < groupLength; ++i) {
+ if (node = group[i]) {
+ exit[i] = node;
+ }
+ }
+ }
+
+ function bindKey(parent, group, enter, update, exit, data, key) {
+ var i,
+ node,
+ nodeByKeyValue = {},
+ groupLength = group.length,
+ dataLength = data.length,
+ keyValues = new Array(groupLength),
+ keyValue;
+
+ // Compute the key for each node.
+ // If multiple nodes have the same key, the duplicates are added to exit.
+ for (i = 0; i < groupLength; ++i) {
+ if (node = group[i]) {
+ keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
+ if (keyValue in nodeByKeyValue) {
+ exit[i] = node;
+ } else {
+ nodeByKeyValue[keyValue] = node;
+ }
+ }
+ }
+
+ // Compute the key for each datum.
+ // If there a node associated with this key, join and add it to update.
+ // If there is not (or the key is a duplicate), add it to enter.
+ for (i = 0; i < dataLength; ++i) {
+ keyValue = keyPrefix + key.call(parent, data[i], i, data);
+ if (node = nodeByKeyValue[keyValue]) {
+ update[i] = node;
+ node.__data__ = data[i];
+ nodeByKeyValue[keyValue] = null;
+ } else {
+ enter[i] = new EnterNode(parent, data[i]);
+ }
+ }
+
+ // Add any remaining nodes that were not bound to data to exit.
+ for (i = 0; i < groupLength; ++i) {
+ if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
+ exit[i] = node;
+ }
+ }
+ }
+
+ function selection_data(value, key) {
+ if (!value) {
+ data = new Array(this.size()), j = -1;
+ this.each(function(d) { data[++j] = d; });
+ return data;
+ }
+
+ var bind = key ? bindKey : bindIndex,
+ parents = this._parents,
+ groups = this._groups;
+
+ if (typeof value !== "function") value = constant(value);
+
+ for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
+ var parent = parents[j],
+ group = groups[j],
+ groupLength = group.length,
+ data = value.call(parent, parent && parent.__data__, j, parents),
+ dataLength = data.length,
+ enterGroup = enter[j] = new Array(dataLength),
+ updateGroup = update[j] = new Array(dataLength),
+ exitGroup = exit[j] = new Array(groupLength);
+
+ bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
+
+ // Now connect the enter nodes to their following update node, such that
+ // appendChild can insert the materialized enter node before this node,
+ // rather than at the end of the parent node.
+ for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
+ if (previous = enterGroup[i0]) {
+ if (i0 >= i1) i1 = i0 + 1;
+ while (!(next = updateGroup[i1]) && ++i1 < dataLength);
+ previous._next = next || null;
+ }
+ }
+ }
+
+ update = new Selection(update, parents);
+ update._enter = enter;
+ update._exit = exit;
+ return update;
+ }
+
+ function selection_exit() {
+ return new Selection(this._exit || this._groups.map(sparse), this._parents);
+ }
+
+ function selection_join(onenter, onupdate, onexit) {
+ var enter = this.enter(), update = this, exit = this.exit();
+ enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + "");
+ if (onupdate != null) update = onupdate(update);
+ if (onexit == null) exit.remove(); else onexit(exit);
+ return enter && update ? enter.merge(update).order() : update;
+ }
+
+ function selection_merge(selection) {
+
+ for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
+ for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
+ if (node = group0[i] || group1[i]) {
+ merge[i] = node;
+ }
+ }
+ }
+
+ for (; j < m0; ++j) {
+ merges[j] = groups0[j];
+ }
+
+ return new Selection(merges, this._parents);
+ }
+
+ function selection_order() {
+
+ for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
+ for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
+ if (node = group[i]) {
+ if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);
+ next = node;
+ }
+ }
+ }
+
+ return this;
+ }
+
+ function selection_sort(compare) {
+ if (!compare) compare = ascending;
+
+ function compareNode(a, b) {
+ return a && b ? compare(a.__data__, b.__data__) : !a - !b;
+ }
+
+ for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
+ for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
+ if (node = group[i]) {
+ sortgroup[i] = node;
+ }
+ }
+ sortgroup.sort(compareNode);
+ }
+
+ return new Selection(sortgroups, this._parents).order();
+ }
+
+ function ascending(a, b) {
+ return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+ }
+
+ function selection_call() {
+ var callback = arguments[0];
+ arguments[0] = this;
+ callback.apply(null, arguments);
+ return this;
+ }
+
+ function selection_nodes() {
+ var nodes = new Array(this.size()), i = -1;
+ this.each(function() { nodes[++i] = this; });
+ return nodes;
+ }
+
+ function selection_node() {
+
+ for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
+ for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
+ var node = group[i];
+ if (node) return node;
+ }
+ }
+
+ return null;
+ }
+
+ function selection_size() {
+ var size = 0;
+ this.each(function() { ++size; });
+ return size;
+ }
+
+ function selection_empty() {
+ return !this.node();
+ }
+
+ function selection_each(callback) {
+
+ for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
+ for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
+ if (node = group[i]) callback.call(node, node.__data__, i, group);
+ }
+ }
+
+ return this;
+ }
+
+ function attrRemove(name) {
+ return function() {
+ this.removeAttribute(name);
+ };
+ }
+
+ function attrRemoveNS(fullname) {
+ return function() {
+ this.removeAttributeNS(fullname.space, fullname.local);
+ };
+ }
+
+ function attrConstant(name, value) {
+ return function() {
+ this.setAttribute(name, value);
+ };
+ }
+
+ function attrConstantNS(fullname, value) {
+ return function() {
+ this.setAttributeNS(fullname.space, fullname.local, value);
+ };
+ }
+
+ function attrFunction(name, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null) this.removeAttribute(name);
+ else this.setAttribute(name, v);
+ };
+ }
+
+ function attrFunctionNS(fullname, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
+ else this.setAttributeNS(fullname.space, fullname.local, v);
+ };
+ }
+
+ function selection_attr(name, value) {
+ var fullname = namespace(name);
+
+ if (arguments.length < 2) {
+ var node = this.node();
+ return fullname.local
+ ? node.getAttributeNS(fullname.space, fullname.local)
+ : node.getAttribute(fullname);
+ }
+
+ return this.each((value == null
+ ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
+ ? (fullname.local ? attrFunctionNS : attrFunction)
+ : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
+ }
+
+ function defaultView(node) {
+ return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
+ || (node.document && node) // node is a Window
+ || node.defaultView; // node is a Document
+ }
+
+ function styleRemove(name) {
+ return function() {
+ this.style.removeProperty(name);
+ };
+ }
+
+ function styleConstant(name, value, priority) {
+ return function() {
+ this.style.setProperty(name, value, priority);
+ };
+ }
+
+ function styleFunction(name, value, priority) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null) this.style.removeProperty(name);
+ else this.style.setProperty(name, v, priority);
+ };
+ }
+
+ function selection_style(name, value, priority) {
+ return arguments.length > 1
+ ? this.each((value == null
+ ? styleRemove : typeof value === "function"
+ ? styleFunction
+ : styleConstant)(name, value, priority == null ? "" : priority))
+ : styleValue(this.node(), name);
+ }
+
+ function styleValue(node, name) {
+ return node.style.getPropertyValue(name)
+ || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
+ }
+
+ function propertyRemove(name) {
+ return function() {
+ delete this[name];
+ };
+ }
+
+ function propertyConstant(name, value) {
+ return function() {
+ this[name] = value;
+ };
+ }
+
+ function propertyFunction(name, value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ if (v == null) delete this[name];
+ else this[name] = v;
+ };
+ }
+
+ function selection_property(name, value) {
+ return arguments.length > 1
+ ? this.each((value == null
+ ? propertyRemove : typeof value === "function"
+ ? propertyFunction
+ : propertyConstant)(name, value))
+ : this.node()[name];
+ }
+
+ function classArray(string) {
+ return string.trim().split(/^|\s+/);
+ }
+
+ function classList(node) {
+ return node.classList || new ClassList(node);
+ }
+
+ function ClassList(node) {
+ this._node = node;
+ this._names = classArray(node.getAttribute("class") || "");
+ }
+
+ ClassList.prototype = {
+ add: function(name) {
+ var i = this._names.indexOf(name);
+ if (i < 0) {
+ this._names.push(name);
+ this._node.setAttribute("class", this._names.join(" "));
+ }
+ },
+ remove: function(name) {
+ var i = this._names.indexOf(name);
+ if (i >= 0) {
+ this._names.splice(i, 1);
+ this._node.setAttribute("class", this._names.join(" "));
+ }
+ },
+ contains: function(name) {
+ return this._names.indexOf(name) >= 0;
+ }
+ };
+
+ function classedAdd(node, names) {
+ var list = classList(node), i = -1, n = names.length;
+ while (++i < n) list.add(names[i]);
+ }
+
+ function classedRemove(node, names) {
+ var list = classList(node), i = -1, n = names.length;
+ while (++i < n) list.remove(names[i]);
+ }
+
+ function classedTrue(names) {
+ return function() {
+ classedAdd(this, names);
+ };
+ }
+
+ function classedFalse(names) {
+ return function() {
+ classedRemove(this, names);
+ };
+ }
+
+ function classedFunction(names, value) {
+ return function() {
+ (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
+ };
+ }
+
+ function selection_classed(name, value) {
+ var names = classArray(name + "");
+
+ if (arguments.length < 2) {
+ var list = classList(this.node()), i = -1, n = names.length;
+ while (++i < n) if (!list.contains(names[i])) return false;
+ return true;
+ }
+
+ return this.each((typeof value === "function"
+ ? classedFunction : value
+ ? classedTrue
+ : classedFalse)(names, value));
+ }
+
+ function textRemove() {
+ this.textContent = "";
+ }
+
+ function textConstant(value) {
+ return function() {
+ this.textContent = value;
+ };
+ }
+
+ function textFunction(value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ this.textContent = v == null ? "" : v;
+ };
+ }
+
+ function selection_text(value) {
+ return arguments.length
+ ? this.each(value == null
+ ? textRemove : (typeof value === "function"
+ ? textFunction
+ : textConstant)(value))
+ : this.node().textContent;
+ }
+
+ function htmlRemove() {
+ this.innerHTML = "";
+ }
+
+ function htmlConstant(value) {
+ return function() {
+ this.innerHTML = value;
+ };
+ }
+
+ function htmlFunction(value) {
+ return function() {
+ var v = value.apply(this, arguments);
+ this.innerHTML = v == null ? "" : v;
+ };
+ }
+
+ function selection_html(value) {
+ return arguments.length
+ ? this.each(value == null
+ ? htmlRemove : (typeof value === "function"
+ ? htmlFunction
+ : htmlConstant)(value))
+ : this.node().innerHTML;
+ }
+
+ function raise() {
+ if (this.nextSibling) this.parentNode.appendChild(this);
+ }
+
+ function selection_raise() {
+ return this.each(raise);
+ }
+
+ function lower() {
+ if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
+ }
+
+ function selection_lower() {
+ return this.each(lower);
+ }
+
+ function selection_append(name) {
+ var create = typeof name === "function" ? name : creator(name);
+ return this.select(function() {
+ return this.appendChild(create.apply(this, arguments));
+ });
+ }
+
+ function constantNull() {
+ return null;
+ }
+
+ function selection_insert(name, before) {
+ var create = typeof name === "function" ? name : creator(name),
+ select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
+ return this.select(function() {
+ return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
+ });
+ }
+
+ function remove() {
+ var parent = this.parentNode;
+ if (parent) parent.removeChild(this);
+ }
+
+ function selection_remove() {
+ return this.each(remove);
+ }
+
+ function selection_cloneShallow() {
+ return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
+ }
+
+ function selection_cloneDeep() {
+ return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
+ }
+
+ function selection_clone(deep) {
+ return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
+ }
+
+ function selection_datum(value) {
+ return arguments.length
+ ? this.property("__data__", value)
+ : this.node().__data__;
+ }
+
+ var filterEvents = {};
+
+ if (typeof document !== "undefined") {
+ var element = document.documentElement;
+ if (!("onmouseenter" in element)) {
+ filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
+ }
+ }
+
+ function filterContextListener(listener, index, group) {
+ listener = contextListener(listener, index, group);
+ return function(event) {
+ var related = event.relatedTarget;
+ if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
+ listener.call(this, event);
+ }
+ };
+ }
+
+ function contextListener(listener, index, group) {
+ return function(event1) {
+ try {
+ listener.call(this, this.__data__, index, group);
+ } finally {
+ }
+ };
+ }
+
+ function parseTypenames(typenames) {
+ return typenames.trim().split(/^|\s+/).map(function(t) {
+ var name = "", i = t.indexOf(".");
+ if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
+ return {type: t, name: name};
+ });
+ }
+
+ function onRemove(typename) {
+ return function() {
+ var on = this.__on;
+ if (!on) return;
+ for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
+ if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
+ this.removeEventListener(o.type, o.listener, o.capture);
+ } else {
+ on[++i] = o;
+ }
+ }
+ if (++i) on.length = i;
+ else delete this.__on;
+ };
+ }
+
+ function onAdd(typename, value, capture) {
+ var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
+ return function(d, i, group) {
+ var on = this.__on, o, listener = wrap(value, i, group);
+ if (on) for (var j = 0, m = on.length; j < m; ++j) {
+ if ((o = on[j]).type === typename.type && o.name === typename.name) {
+ this.removeEventListener(o.type, o.listener, o.capture);
+ this.addEventListener(o.type, o.listener = listener, o.capture = capture);
+ o.value = value;
+ return;
+ }
+ }
+ this.addEventListener(typename.type, listener, capture);
+ o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
+ if (!on) this.__on = [o];
+ else on.push(o);
+ };
+ }
+
+ function selection_on(typename, value, capture) {
+ var typenames = parseTypenames(typename + ""), i, n = typenames.length, t;
+
+ if (arguments.length < 2) {
+ var on = this.node().__on;
+ if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
+ for (i = 0, o = on[j]; i < n; ++i) {
+ if ((t = typenames[i]).type === o.type && t.name === o.name) {
+ return o.value;
+ }
+ }
+ }
+ return;
+ }
+
+ on = value ? onAdd : onRemove;
+ if (capture == null) capture = false;
+ for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
+ return this;
+ }
+
+ function dispatchEvent(node, type, params) {
+ var window = defaultView(node),
+ event = window.CustomEvent;
+
+ if (typeof event === "function") {
+ event = new event(type, params);
+ } else {
+ event = window.document.createEvent("Event");
+ if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
+ else event.initEvent(type, false, false);
+ }
+
+ node.dispatchEvent(event);
+ }
+
+ function dispatchConstant(type, params) {
+ return function() {
+ return dispatchEvent(this, type, params);
+ };
+ }
+
+ function dispatchFunction(type, params) {
+ return function() {
+ return dispatchEvent(this, type, params.apply(this, arguments));
+ };
+ }
+
+ function selection_dispatch(type, params) {
+ return this.each((typeof params === "function"
+ ? dispatchFunction
+ : dispatchConstant)(type, params));
+ }
+
+ var root = [null];
+
+ function Selection(groups, parents) {
+ this._groups = groups;
+ this._parents = parents;
+ }
+
+ function selection() {
+ return new Selection([[document.documentElement]], root);
+ }
+
+ Selection.prototype = selection.prototype = {
+ constructor: Selection,
+ select: selection_select,
+ selectAll: selection_selectAll,
+ filter: selection_filter,
+ data: selection_data,
+ enter: selection_enter,
+ exit: selection_exit,
+ join: selection_join,
+ merge: selection_merge,
+ order: selection_order,
+ sort: selection_sort,
+ call: selection_call,
+ nodes: selection_nodes,
+ node: selection_node,
+ size: selection_size,
+ empty: selection_empty,
+ each: selection_each,
+ attr: selection_attr,
+ style: selection_style,
+ property: selection_property,
+ classed: selection_classed,
+ text: selection_text,
+ html: selection_html,
+ raise: selection_raise,
+ lower: selection_lower,
+ append: selection_append,
+ insert: selection_insert,
+ remove: selection_remove,
+ clone: selection_clone,
+ datum: selection_datum,
+ on: selection_on,
+ dispatch: selection_dispatch
+ };
+
+ function select(selector) {
+ return typeof selector === "string"
+ ? new Selection([[document.querySelector(selector)]], [document.documentElement])
+ : new Selection([[selector]], root);
+ }
+
+ /*
+
+ Uses the Mediawiki API to display a list of recent images and a link to
+ the page where the image has been used/placed.
+
+ Makes use of the following API calls:
+
+ * https://www.mediawiki.org/wiki/API:Allimages
+ * https://www.mediawiki.org/wiki/API:Imageinfo
+ * https://www.mediawiki.org/wiki/API:Imageusage
+
+ */
+ var NUM_FILES = 10; /* how many files to show */
+
+ async function get_json (url) {
+ var resp = await fetch(url);
+ return await resp.json();
+ }
+
+ function url_for_title (title) {
+ return "/w/"+encodeURI(title.replace(/ /g, "_"));
+ }
+
+ async function load () {
+ var main = select("#content"),
+ baseurl = "/mw/api.php?action=query&list=allimages&ailimit=1&format=json&formatversion=2&aisort=timestamp&aidir=older&aiprop=timestamp|user|url|mime|size",
+ url = baseurl,
+ count = 0;
+ while (count < NUM_FILES) {
+ // console.log("starting loop", debugloopcount, "count", count, "url", url);
+ let resp = await fetch(url),
+ data = await resp.json(),
+ allimages = data.query.allimages,
+ useimages = [];
+ // console.log("got data", data.query.allimages.length);
+ // For each image:
+ // Use API:Imageinfo request/get the URL to a thumbnail image
+ //
+ for (var i=0, l=allimages.length; id.imageinfo.thumburl && (d.imageusage.length > 0));
+ let items = main.selectAll("div.file")
+ .data(useimages, d=>d.title)
+ .enter()
+ .append("div")
+ .attr("class", "file")
+ .append("a")
+ .attr("href", d=>url_for_title(d.imageusage[d.imageusage.length-1].title))
+ .attr("target", "wikiframe")
+ .append("img")
+ .attr('src', d=>d.imageinfo.thumburl);
+
+ count += useimages.length;
+ if (data.continue) {
+ url = baseurl+"&aicontinue="+data.continue.aicontinue;
+ }
+ // if (debugloopcount >= 5) break;
+ }
+
+ }
+ document.addEventListener("DOMContentLoaded", load);
+
+}());
diff --git a/special/recentfiles/package.json b/special/recentfiles/package.json
new file mode 100644
index 0000000..012e95d
--- /dev/null
+++ b/special/recentfiles/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "recentfiles",
+ "version": "1.0.0",
+ "description": "",
+ "main": "rollup.config.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "d3-selection": "^1.4.0",
+ "rollup": "^1.17.0"
+ }
+}
diff --git a/special/recentfiles/recentfiles.html b/special/recentfiles/recentfiles.html
new file mode 100644
index 0000000..a78ec21
--- /dev/null
+++ b/special/recentfiles/recentfiles.html
@@ -0,0 +1,27 @@
+
+
+
+recent files
+
+
+
+
+
+
+
+
diff --git a/special/recentfiles/rollup.config.js b/special/recentfiles/rollup.config.js
new file mode 100644
index 0000000..13bbf30
--- /dev/null
+++ b/special/recentfiles/rollup.config.js
@@ -0,0 +1,17 @@
+// rollup.config.js
+// https://github.com/rollup/rollup-plugin-commonjs
+import commonjs from 'rollup-plugin-commonjs';
+import resolve from 'rollup-plugin-node-resolve';
+
+export default [{
+ input: 'src/recentfiles.js',
+ output: {
+ file: 'dist/recentfiles.js',
+ format: 'iife',
+ name: 'app'
+ },
+ plugins: [
+ resolve(),
+ commonjs()
+ ]
+}];
\ No newline at end of file
diff --git a/special/recentfiles/src/recentfiles.js b/special/recentfiles/src/recentfiles.js
new file mode 100644
index 0000000..843d5df
--- /dev/null
+++ b/special/recentfiles/src/recentfiles.js
@@ -0,0 +1,87 @@
+import { selectAll, select } from 'd3-selection';
+
+/*
+
+Uses the Mediawiki API to display a list of recent images and a link to
+the page where the image has been used/placed.
+
+Makes use of the following API calls:
+
+* https://www.mediawiki.org/wiki/API:Allimages
+* https://www.mediawiki.org/wiki/API:Imageinfo
+* https://www.mediawiki.org/wiki/API:Imageusage
+
+*/
+var NUM_FILES = 10; /* how many files to show */
+
+async function get_json (url) {
+ var resp = await fetch(url);
+ return await resp.json();
+}
+
+function url_for_title (title) {
+ return "/w/"+encodeURI(title.replace(/ /g, "_"));
+}
+
+async function load () {
+ var main = select("#content"),
+ baseurl = "/mw/api.php?action=query&list=allimages&ailimit=1&format=json&formatversion=2&aisort=timestamp&aidir=older&aiprop=timestamp|user|url|mime|size",
+ url = baseurl,
+ count = 0;
+ let debugloopcount = 0;
+ while (count < NUM_FILES) {
+ // console.log("starting loop", debugloopcount, "count", count, "url", url);
+ let resp = await fetch(url),
+ data = await resp.json(),
+ allimages = data.query.allimages,
+ useimages = [];
+ // console.log("got data", data.query.allimages.length);
+ // For each image:
+ // Use API:Imageinfo request/get the URL to a thumbnail image
+ //
+ for (var i=0, l=allimages.length; id.imageinfo.thumburl && (d.imageusage.length > 0));
+ let items = main.selectAll("div.file")
+ .data(useimages, d=>d.title)
+ .enter()
+ .append("div")
+ .attr("class", "file")
+ .append("a")
+ .attr("href", d=>url_for_title(d.imageusage[d.imageusage.length-1].title))
+ .attr("target", "wikiframe")
+ .append("img")
+ .attr('src', d=>d.imageinfo.thumburl);
+
+ count += useimages.length;
+ if (data.continue) {
+ url = baseurl+"&aicontinue="+data.continue.aicontinue;
+ }
+ debugloopcount += 1;
+ // if (debugloopcount >= 5) break;
+ }
+
+}
+document.addEventListener("DOMContentLoaded", load);
+
+
diff --git a/src/legend.json b/src/legend.json
index 2a1a59d..209fb17 100644
--- a/src/legend.json
+++ b/src/legend.json
@@ -11,7 +11,7 @@
},
{
"key" : "Cours de soutien à l'orientation",
- "symbol" : "symbols.svg#Cours_de_soutien_a_l'orientation",
+ "symbol" : "symbols.svg#Cours_de_soutien_a_l_orientation",
"icon" : "img/Cours_de_soutien_a_lorientation.png"
},
{
@@ -34,6 +34,11 @@
"symbol" : "symbols.svg#Enseignants",
"icon" : "img/Enseignants.png"
},
+ {
+ "key" : "Actualités",
+ "symbol" : "symbols.svg#Actualites",
+ "icon" : "img/Actualites.png"
+ },
{
"key" : "default",
"symbol" : "symbols.svg#Main",
diff --git a/src/wikimap.js b/src/wikimap.js
index 2a876e0..c6ff5b2 100644
--- a/src/wikimap.js
+++ b/src/wikimap.js
@@ -14,7 +14,8 @@ export class Map {
constructor (opts) {
var width = 600,
height = 600;
-
+ this.width = width;
+ this.height = height;
this.zoom_level = opts.zoom || 1.5;
this.apiurl = opts.apiurl;
this.categorylabel = opts.categorylabel || "Category";
@@ -89,10 +90,31 @@ export class Map {
})
cat.append("span").attr("class", "count").html(d => d.tcount)
+ var set_active_url_from_window = () => {
+ var title = this.wiki.unescapeTitle(window.location.hash.substring(1)),
+ page = this.wiki.get_page_by_title(title),
+ url = page.url();
+ console.log("wikimap init", page.title, url);
+ this.set_active_url(url);
+ };
+
this.loaded = true;
- if (this.active_url) {
+ if (window.location.hash) {
+ set_active_url_from_window();
+ } else if (this.active_url) {
this.set_active_url(this.active_url);
}
+
+ window.addEventListener("hashchange", e => {
+ console.log("hashchange");
+ set_active_url_from_window()
+ });
+ /*
+ window.addEventListener("popstate", e => {
+ // console.log("popstate", e);
+ console.log("popstate: " + document.location + ", state: " + JSON.stringify(e.state));
+ })
+ */
}
on (message, callback, context) {
@@ -124,10 +146,20 @@ export class Map {
.attr("class", "links");
this.nodesg = this.content.append("g")
.attr("class", "nodes");
+
+ // DEBUGGING
+ this.svg.on("click", x => {
+ // console.log("svg click", event.target);
+ if (event.target == this.svg.node()) {
+ console.log("(debug) BACKGROUND CLICK", this.active_page.x, this.active_page.y);
+ this.centerOnItem(this.active_page);
+ }
+ })
}
dragstarted (d) {
- // if (!event.active) this.simulation.alphaTarget(0.3).restart();
+ if (!event.active) this.simulation.alphaTarget(0.3).restart();
+ // this.simulation.restart();
d.fx = d.x;
d.fy = d.y;
}
@@ -138,7 +170,7 @@ export class Map {
}
dragended(d) {
- // if (!event.active) this.simulation.alphaTarget(0);
+ if (!event.active) this.simulation.alphaTarget(0);
d.fx = null;
d.fy = null;
}
@@ -167,11 +199,16 @@ export class Map {
return ret;
}
+ // function called on iframe load
async set_active_url (url) {
- this.active_url = url;
+ console.log("wikimap.set_active_url", url);
+ this.active_url = url;
if (this.loaded) {
var page = this.wiki.get_page(this.active_url);
if (page) {
+ // console.log("calling replaceState", page.title);
+ window.history.replaceState (null, null, "#"+this.wiki.escapeTitle(page.title));
+ // window.location.hash = this.wiki.escapeTitle(page.title);
this.set_active_page(page);
} else {
console.log("wikimap: set_active_url: NO PAGE FOR", url);
@@ -223,9 +260,12 @@ export class Map {
// console.log("page is already the active page", page, this.active_page);
return;
}
-
+ // window.location.hash = this.wiki.escapeTitle(page.title);
+ // window.history.pushState ({pagetitle: page.title}, page.title, "/m/"+this.wiki.escapeTitle(page.title));
// cleanup old
if (this.active_page) {
+ this.active_page.fx = undefined;
+ this.active_page.fy = undefined;
this.active_page.active = false;
// deactivate linked links/nodes
this.linked_nodes_set_active(this.active_page, false);
@@ -266,10 +306,10 @@ export class Map {
// LOAD/ENSURE PAGE LINKS
var links_out = await page.get_links();
links_out = links_out.filter(p => (!p.redirect && p.ns == 0));
- console.log("links_out", links_out);
+ // console.log("links_out", links_out);
var links_in = await page.get_linkshere();
links_in = links_in.filter(p => (!p.redirect && p.ns == 0));
- console.log("links_in", links_in);
+ // console.log("links_in", links_in);
links_out.forEach(p => {
this.ensure_link(page, p).wiki = true;
});
@@ -280,12 +320,19 @@ export class Map {
}
this.active_page = page;
+ // console.log("fixing active page", this.active_page);
+ if (this.active_page.x === undefined) {
+ this.active_page.x = this.width/2;
+ this.active_page.y = this.height/2;
+ }
+ this.active_page.fx = this.active_page.x;
+ this.active_page.fy = this.active_page.y;
this.active_page.active = true;
this.linked_nodes_set_active(this.active_page, true);
- setTimeout(() => {
- this.centerOnItem(page, 1000);
- }, 1000);
+ //setTimeout(() => {
+ this.centerOnItem(page, 1000);
+ //}, 1000);
this.events.emit("page", this.active_page);
var data = {nodes: this.get_nodes(), links: values(this.all_links_by_key)};
@@ -342,7 +389,7 @@ export class Map {
}
update_graph (graph) {
- console.log("UPDATE GRAPH", graph.nodes.length, graph.links.length);
+ // console.log("UPDATE GRAPH", graph.nodes.length, graph.links.length);
var link = this.linksg.selectAll("line")
.data(graph.links, d => { return this.link_key(d.source.title, d.target.title) });
var link_enter = link.enter()
@@ -375,11 +422,15 @@ export class Map {
})
.on("mouseover", function (d) {
// console.log("mouseover", this);
+ // d.mouse = true;
select(this).classed("mouse", true);
+ // that.update_nodes();
})
.on("mouseout", function (d) {
// console.log("mouseout", this);
+ // d.mouse = false;
select(this).classed("mouse", false);
+ // that.update_nodes();
})
.call(drag()
.on("start", this.dragstarted.bind(this))
@@ -450,13 +501,14 @@ export class Map {
update_nodes () {
var nodes = this.nodesg.selectAll("g.page");
// console.log("update_nodes", nodes.size());
+ nodes.classed("mouse", d=>d.mouse);
nodes.classed("active", d=>d.active);
nodes.classed("active2", d=>d.active2);
nodes.classed("highlight", d=>d.highlight);
nodes.sort((a, b) => {
// console.log("sort", a, b);
- var x = a.active ? 10 : (a.active2 ? 5 : 0),
- y = b.active ? 10 : (b.active2 ? 5 : 0);
+ var x = a.mouse ? 10 : (a.active ? 8 : (a.active2 ? 5 : 0)),
+ y = b.mouse ? 10 : (b.active ? 8 : (b.active2 ? 5 : 0));
return x - y;
});
var links = this.linksg.selectAll("line");
@@ -488,10 +540,13 @@ export class Map {
centerOnItem(item, duration) {
var bounds = this.svg.node().getBoundingClientRect();
var curt = zoomTransform(this.rect.node());
- console.log("centerOnItem", this.zoom_level, "item", item);
+ // console.log("centerOnItem", this.zoom_level, "item", item);
var zoom_level = this.zoom_level ? this.zoom_level : curt.k;
var ITEM_SIZE = 36;
if (item && item.x !== undefined) {
+ this.zoom.translateTo(duration ? this.rect.transition().duration(duration) : this.rect, item.x, item.y);
+ // this.zoom.translateTo(this.rect, item.x, item.y);
+ /*
var transform = function () {
return zoomIdentity
.translate(bounds.width / 2, bounds.height / 2)
@@ -503,6 +558,7 @@ export class Map {
} else {
this.rect.call(this.zoom.transform, transform);
}
+ */
} else {
console.log("NO ITEM");
var transform = function () {
diff --git a/style.css b/style.css
index 75c7034..8de9d08 100644
--- a/style.css
+++ b/style.css
@@ -1,84 +1,38 @@
+:root {
+ --color-a: #A700FF;
+ --color-a-shadow: rgba(167, 0, 255, 0.44);
+ --color-b: #00AB6B;
+}
+
/* F O N T E S */
@font-face {
font-family: "Combined";
- src: url('/typo/Combined/combined.otf');
+ src: url('/mw/skins/foreground/assets/fonts/combined.otf');
+ font-style: normal;
+ font-weight: normal;
+}
+@font-face {
+ font-family: "Vega";
+ src: url('/mw/skins/foreground/assets/fonts/Vega-regular.otf');
font-style: normal;
font-weight: normal;
}
@font-face {
- font-family: 'combinedregular';
- src: url('/typo/Combined/web/combined.eot');
- src: url('/typo/Combined/web/combined.eot?#iefix') format('embedded-opentype'),
- url('/typo/Combined/web/combined.woff2') format('woff2'),
- url('/typo/Combined/web/combined.woff') format('woff'),
- url('/typo/Combined/web/combined.ttf') format('truetype'),
- url('/typo/Combined/web/combined.svg#combinedregular') format('svg');
- font-weight: normal;
- font-style: normal;
+ font-family:'FontAwesome';
+ src:url(/mw/skins/foreground/assets/fonts/fontawesome-webfont.eot?32400);
+ src:url(/mw/skins/foreground/assets/fonts/fontawesome-webfont.eot?32400) format('embedded-opentype'),url(/mw/skins/foreground/assets/fonts/fontawesome-webfont.woff2?db812) format('woff2'),url(/mw/skins/foreground/assets/fonts/fontawesome-webfont.woff?a3572) format('woff'),url(/mw/skins/foreground/assets/fonts/fontawesome-webfont.ttf?a3de2) format('truetype'),url(/mw/skins/foreground/assets/fonts/fontawesome-webfont.svg?f775f) format('svg');
+ font-weight:normal;
+ font-style:normal
}
-@font-face {
- font-family: 'wremena';
- src: url('typo/Wremema/webfont/wremena_bold-webfont.woff2') format('woff2'),
- url('typo/Wremema/webfont/wremena_bold-webfont.woff') format('woff'),
- url('typo/Wremema/webfont/wremena_bold-webfont.ttf') format('truetype'),
- url('typo/Wremema/webfont/wremena_bold-webfont.svg#wremenabold') format('svg');
- font-weight: bold;
- font-style: normal;
-}
-
-@font-face {
- font-family: 'wremena';
- src: url('typo/Wremema/webfont/wremena_regular-webfont.woff2') format('woff2'),
- url('typo/Wremema/webfont/wremena_regular-webfont.woff') format('woff'),
- url('typo/Wremema/webfont/wremena_regular-webfont.ttf') format('truetype'),
- url('typo/Wremema/webfont/wremena_regular-webfont.svg#wremenaregular') format('svg');
- font-weight: normal;
- font-style: normal;
-}
-
-@font-face {
- font-family: 'wremena';
- src: url('typo/Wremema/webfont/wremena_light-webfont.woff2') format('woff2'),
- url('typo/Wremema/webfont/wremena_light-webfont.woff') format('woff'),
- url('typo/Wremema/webfont/wremena_light-webfont.ttf') format('truetype'),
- url('typo/Wremema/webfont/wremena_light-webfont.svg#wremenalight') format('svg');
- font-weight: normal;
- font-style: 200;
-}
-
-@font-face {
- font-family: 'Coupeur Monospace Bold';
- src: url('/typo/Coupeur/webfont/CoupeurMonospace-Bold.eot'); /* IE9 Compat Modes */
- src: url('/typo/Coupeur/webfont/CoupeurMonospace-Bold.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('/typo/Coupeur/webfont/CoupeurMonospace-Bold.woff') format('woff'), /* Modern Browsers */
- url('/typo/Coupeur/webfont/CoupeurMonospace-Bold.ttf') format('truetype'), /* Safari, Android, iOS */
- url('/typo/Coupeur/webfont/CoupeurMonospace-Bold.svg#fcf36b8f65c0f0737cd36a2be6922659') format('svg'); /* Legacy iOS */
-
- font-style: normal;
- font-weight: 700;
-}
-
-@font-face {
- font-family: 'Coupeur Monospace Normal';
- src: url('/typo/Coupeur/webfont/CoupeurMonospace-Normal.eot'); /* IE9 Compat Modes */
- src: url('/typo/Coupeur/webfont/CoupeurMonospace-Normal.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('/typo/Coupeur/webfont/CoupeurMonospace-Normal.woff') format('woff'), /* Modern Browsers */
- url('/typo/Coupeur/webfont/CoupeurMonospace-Normal.ttf') format('truetype'), /* Safari, Android, iOS */
- url('/typo/Coupeur/webfont/CoupeurMonospace-Normal.svg#4b219f539d302a6ffd9fd41e2da16172') format('svg'); /* Legacy iOS */
-
- font-style: normal;
- font-weight: 400;
-}
-
-
body {
margin: 0;
padding: 0;
background: #f1f2f3;
overflow: hidden;
+ font-family: Vega;
}
.links line {
@@ -87,7 +41,7 @@ body {
}
.links line.active2 {
- stroke: magenta;
+ stroke: var(--color-a);
}
.links line.history {
@@ -95,11 +49,11 @@ body {
}
.active {
- stroke: magenta;
+ stroke: var(--color-a);
}
.category circle {
- fill: cyan;
+ fill: var(--color-b);
}
.web circle {
@@ -133,7 +87,7 @@ svg g.page {
svg g.page text {
visibility: hidden;
fill: #222;
- font: 9px sans-serif;
+ font: 12px Vega;
}
svg g.active text {
@@ -151,7 +105,7 @@ use {
.highlight use {
fill: #FFF;
- stroke: cyan;
+ stroke: var(--color-b);
}
.active use {
@@ -175,7 +129,7 @@ use {
.active use {
fill: #FFF;
- stroke: magenta;
+ stroke: var(--color-a);
}
.active text {
@@ -184,7 +138,7 @@ use {
.active2 use {
fill: #FFF;
- stroke: magenta;
+ stroke: var(--color-a);
}
@@ -192,15 +146,14 @@ use {
/* Categories */
#cats .body {
- display: none;
+ /*display: none;*/
}
#cats .placeholder {
min-width: 100%;
text-align: center;
- color: gray;
- font-weight: bold;
- font-size: 12px;
+ position: relative;
+ top: 3px;
}
#cats.expanded .body {
display: block;
@@ -221,7 +174,7 @@ use {
font-size: 12px;
min-width: 16px;
min-height: 16px;
- box-shadow: 0 3px 3px 3px rgba(255, 0, 255, 0.44);
+ box-shadow: 0 3px 3px 3px var(--color-a-shadow);
}
#cats div.cat span.icon {
@@ -233,13 +186,17 @@ use {
background-repeat: no-repeat;
margin-right: 4px;
background-position: center center;
+ background-size: contain;
+}
+#cats div.cat:last-child span.icon {
+ background-size: 50%;
}
#cats div.cat span.count {
display: none;
padding: 0px 3px;
background: #DDD;
color: #444;
- font-size: 10px;
+ font-size: 12px;
margin-left: 4px;
}
#cats div.cat a {
@@ -247,7 +204,7 @@ use {
text-decoration: none;
}
#cats div.cat.highlight a {
- color: cyan;
+ color: var(--color-b);
}
#cats hr {
color: white;
@@ -289,10 +246,6 @@ a.talk {
}
-
-
-
-
/* control positioning */
.leaflet-control {
@@ -333,8 +286,11 @@ a.talk {
.leaflet-bar a:hover {
background-color: #f4f4f4;
}
-.leaflet-bar a:first-child {
- }
+.leaflet-bar a:first-child:before {
+ content: " ";
+ height: 2px;
+ display: block;
+ }
.leaflet-bar a:last-child {
border-bottom: none;
}
@@ -351,16 +307,38 @@ a.talk {
position: absolute;
left: 10px;
top: 10px;
- z-index: 10000;
+ z-index: 10;
}
+#specialclosediv {
+ position: absolute;
+ left: 10px;
+ top: 10px;
+ z-index: 10000;
+ box-shadow: 0 3px 3px 3px var(--color-a-shadow);
+ background-color: #ffffff;
+ display: none;
+}
+#specialclosediv a, #specialclosediv a:hover {
+ font-size: 24px;
+ background-color: #fff;
+ border-bottom: 1px solid #ccc;
+ width: 26px;
+ height: 26px;
+ display: block;
+ text-align: center;
+ text-decoration: none;
+ color: black;
+}
+
+
.leaflet-control-zoom-in,
.leaflet-control-zoom-out {
font: Combined;
- font-size: 24px;
+ font-size: 17px;
line-height: 20px;
text-indent: 1px;
- box-shadow: 0 3px 3px 3px rgba(255, 0, 255, 0.44);
+ box-shadow: 0 3px 3px 3px var(--color-a-shadow);
background-color: #ffffff;
}
@@ -373,21 +351,52 @@ a.talk {
position: absolute;
left: 0; top: 0;
right: 0;
- height: 160vh;
+ height: 150vh;
}
-#page {
- position: absolute;
- left: 0; top: 0;
- height: 60vh;
- width: 100vw;
-}
-
-#wikiframediv {
+ #page {
position: absolute;
- left: 0; top: 60vh;
- height: 100vh;
- width: 100vw;
-}
+ left: 0; top: 0;
+ height: 50vh;
+ width: 100vw;
+ }
+
+ #wikiframediv {
+ position: absolute;
+ left: 0; top: 50vh;
+ height: 100vh;
+ width: 100vw;
+ }
}
+
+#specialselectdiv {
+ position: absolute;
+ bottom: 10px;
+ right: 10px;
+ z-index: 10000;
+}
+#specialselectdiv select {
+ box-shadow: 0 3px 3px 3px var(--color-a-shadow);
+ background-color: white;
+ font-family: Vega;
+ font-size: 12px;
+ padding: 6px 2px;
+ text-transform: uppercase;
+}
+
+
+#specialiframediv {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ display: none;
+ z-index: 100;
+}
+#specialiframediv iframe {
+ width: 100%;
+ height: 100%;
+ border: none;
+}
diff --git a/symbols.svg b/symbols.svg
index 71e3184..a2a52c0 100644
--- a/symbols.svg
+++ b/symbols.svg
@@ -14,7 +14,7 @@
viewBox="0 0 32.3875 32.356251"
version="1.1"
id="svg5507"
- inkscape:version="0.92.1 r15371"
+ inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="symbols.svg"
enable-background="new">
+ inkscape:window-width="1362"
+ inkscape:window-height="718"
+ inkscape:window-x="2"
+ inkscape:window-y="48"
+ inkscape:window-maximized="1"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-paths="true"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ showguides="true"
+ inkscape:guide-bbox="true">
+
+
+
@@ -49,7 +73,7 @@
image/svg+xml
-
+
@@ -58,13 +82,12 @@
id="layer2"
inkscape:label="Main"
style="display:none">
-
+ d="m 0.05427516,-1.0836044 c -0.3145139,0 -0.6143881,0.069209 -0.886913,0.18447807 -0.27252616,0.11526864 -0.51761266,0.2834672 -0.72372176,0.48957617 -0.2061091,0.2061091 -0.3743076,0.4511958 -0.4895767,0.7237215 -0.1152682,0.2725256 -0.1773827,0.5723994 -0.1773827,0.88691326 0,0.3145142 0.062114,0.6072926 0.1773827,0.8798184 0.1152691,0.2725256 0.2834676,0.5247077 0.4895767,0.7308165 0.2061091,0.2061091 0.4511956,0.3672123 0.72372176,0.4824809 0.2725249,0.1152689 0.5723991,0.1844781 0.886913,0.1844781 0.314514,0 0.614388,-0.069209 0.886913,-0.1844781 C 1.2137144,3.1789318 1.4588008,3.0178286 1.6649099,2.8117195 1.871019,2.6056107 2.0392175,2.3534286 2.1544867,2.080903 2.2697548,1.8083772 2.3318695,1.5155988 2.3318695,1.2010846 2.3318695,0.88657074 2.2697548,0.58669694 2.1544867,0.31417134 2.0392175,0.04164564 1.871019,-0.20344106 1.6649099,-0.40955016 1.4588008,-0.61565913 1.2137144,-0.78385769 0.94118816,-0.89912633 0.66866316,-1.014395 0.36878916,-1.0836044 0.05427516,-1.0836044 Z"
+ style="display:inline;fill-opacity:1;stroke-width:0.72655946;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99615389;marker-start:none"
+ inkscape:connector-curvature="0"
+ inkscape:label="#path6386-5-5" />
+ transform="matrix(0.40423298,0,0,0.40423298,35.516699,1.0220982)">
@@ -91,10 +114,11 @@
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Ateliers_pluridisciplinaires"
- style="display:none;">
+ style="display:none">
+ transform="matrix(0.65256016,0,0,0.65256016,58.839197,-27.116613)"
+ id="Ateliers_pluridisciplinaires"
+ style="">
+ id="path8174"
+ inkscape:connector-curvature="0" />
+ id="Cours_de_soutien_a_l_orientation"
+ style="display:inline;fill-opacity:1;stroke-opacity:0.99615389"
+ transform="matrix(0.40423297,0,0,0.40423297,35.552134,0.97198436)"
+ inkscape:label="#Cours_de_soutien_a_l_orientation">
@@ -145,7 +169,7 @@
+ transform="matrix(0.40361541,0,0,0.40361541,36.375644,35.301905)">
+ inkscape:label="Actualites"
+ style="display:none">
+
+
+
+
+
+
+ style="display:inline">