Commit a540dfc5 authored by Romain Loth's avatar Romain Loth

Merge branch 'refactoring' into romain-refactoring

Conflicts:
	templates/graphExplorer/explorer.html
parents 41c0706d d8d3bc70
...@@ -120,48 +120,61 @@ LANGUAGES = { ...@@ -120,48 +120,61 @@ LANGUAGES = {
from gargantext.util.parsers import \ from gargantext.util.parsers import \
EuropressParser, RISParser, PubmedParser, ISIParser, CSVParser, ISTexParser EuropressParser, RISParser, PubmedParser, ISIParser, CSVParser, ISTexParser
def resourcetype(name):
'''
resourcetype :: String -> Int
Usage : resourcetype("Europress (English)") == 1
Examples in scrapers scripts (Pubmed or ISTex for instance).
'''
return [n[0] for n in enumerate(r['name'] for r in RESOURCETYPES) if n[1] == name][0]
RESOURCETYPES = [ RESOURCETYPES = [
# type 0 # type 0
{ 'name': 'Select database below',
'parser': None,
'default_language': None,
},
# type 1
{ 'name': 'Europress (English)', { 'name': 'Europress (English)',
'parser': EuropressParser, 'parser': EuropressParser,
'default_language': 'en', 'default_language': 'en',
}, },
# type 1 # type 2
{ 'name': 'Europress (French)', { 'name': 'Europress (French)',
'parser': EuropressParser, 'parser': EuropressParser,
'default_language': 'fr', 'default_language': 'fr',
}, },
# type 2 # type 3
{ 'name': 'Jstor (RIS format)', { 'name': 'Jstor (RIS format)',
'parser': RISParser, 'parser': RISParser,
'default_language': 'en', 'default_language': 'en',
}, },
# type 3 # type 4
{ 'name': 'Pubmed (XML format)', { 'name': 'Pubmed (XML format)',
'parser': PubmedParser, 'parser': PubmedParser,
'default_language': 'en', 'default_language': 'en',
}, },
# type 4 # type 5
{ 'name': 'Scopus (RIS format)', { 'name': 'Scopus (RIS format)',
'parser': RISParser, 'parser': RISParser,
'default_language': 'en', 'default_language': 'en',
}, },
# type 5 # type 6
{ 'name': 'Web of Science (ISI format)', { 'name': 'Web of Science (ISI format)',
'parser': ISIParser, 'parser': ISIParser,
'default_language': 'en', 'default_language': 'en',
}, },
# type 6 # type 7
{ 'name': 'Zotero (RIS format)', { 'name': 'Zotero (RIS format)',
'parser': RISParser, 'parser': RISParser,
'default_language': 'en', 'default_language': 'en',
}, },
# type 7 # type 8
{ 'name': 'CSV', { 'name': 'CSV',
'parser': CSVParser, 'parser': CSVParser,
'default_language': 'en', 'default_language': 'en',
}, },
# type 8 # type 9
{ 'name': 'ISTex', { 'name': 'ISTex',
'parser': ISTexParser, 'parser': ISTexParser,
'default_language': 'en', 'default_language': 'en',
...@@ -215,3 +228,11 @@ BATCH_NGRAMSEXTRACTION_SIZE = 1024 ...@@ -215,3 +228,11 @@ BATCH_NGRAMSEXTRACTION_SIZE = 1024
# Scrapers config # Scrapers config
QUERY_SIZE_N_MAX = 1000 QUERY_SIZE_N_MAX = 1000
QUERY_SIZE_N_DEFAULT = 1000 QUERY_SIZE_N_DEFAULT = 1000
# Grammar rules for chunking
RULE_JJNN = "{<JJ.*>*<NN.*|>+<JJ.*>*}"
RULE_JJDTNN = "{<JJ.*>*<NN.*>+((<P|IN> <DT>? <JJ.*>* <NN.*>+ <JJ.*>*)|(<JJ.*>))*}"
RULE_TINA = "^((VBD,|VBG,|VBN,|CD.?,|JJ.?,|\?,){0,2}?(N.?.?,|\?,)+?(CD.,)??)\
+?((PREP.?|DET.?,|IN.?,|CC.?,|\?,)((VBD,|VBG,|VBN,|CD.?,|JJ.?,|\?\
,){0,2}?(N.?.?,|\?,)+?)+?)*?$"
from gargantext.util.languages import languages from gargantext.util.languages import languages
from gargantext.constants import LANGUAGES, DEFAULT_MAX_NGRAM_LEN from gargantext.constants import LANGUAGES, DEFAULT_MAX_NGRAM_LEN, RULE_JJNN, RULE_JJDTNN
import nltk import nltk
import re import re
class NgramsExtractor: class NgramsExtractor:
def __init__(self, tagger): def __init__(self, tagger):
...@@ -17,7 +15,7 @@ class NgramsExtractor: ...@@ -17,7 +15,7 @@ class NgramsExtractor:
""" """
return re.sub(r'<[^>]{0,45}>', '', text) return re.sub(r'<[^>]{0,45}>', '', text)
def extract(self, text, rule='{<JJ.*>*<NN.*>+((<P|IN> <DT>? <JJ.*>* <NN.*>+ <JJ.*>*)|(<JJ.*>))*}', label='NP', max_n_words=DEFAULT_MAX_NGRAM_LEN): def extract(self, text, rule=RULE_JJNN, label='NP', max_n_words=DEFAULT_MAX_NGRAM_LEN):
text = self.clean_text(text) text = self.clean_text(text)
grammar = nltk.RegexpParser(label + ': ' + rule) grammar = nltk.RegexpParser(label + ': ' + rule)
tagged_tokens = list(self._tagger.tag_text(text)) tagged_tokens = list(self._tagger.tag_text(text))
......
...@@ -8,7 +8,7 @@ from traceback import print_tb ...@@ -8,7 +8,7 @@ from traceback import print_tb
from django.shortcuts import redirect, render from django.shortcuts import redirect, render
from django.http import Http404, HttpResponseRedirect, HttpResponseForbidden from django.http import Http404, HttpResponseRedirect, HttpResponseForbidden
from gargantext.constants import RESOURCETYPES, QUERY_SIZE_N_MAX from gargantext.constants import resourcetype, QUERY_SIZE_N_MAX
from gargantext.models.nodes import Node from gargantext.models.nodes import Node
from gargantext.util.db import session from gargantext.util.db import session
from gargantext.util.http import JsonHttpResponse from gargantext.util.http import JsonHttpResponse
...@@ -133,7 +133,7 @@ def save(request , project_id): ...@@ -133,7 +133,7 @@ def save(request , project_id):
if filename!=False: if filename!=False:
# add the uploaded resource to the corpus # add the uploaded resource to the corpus
corpus.add_resource( corpus.add_resource(
type = int(8) # cf. constants.RESOURCETYPES type = resourcetype('ISTex')
, path = filename , path = filename
) )
dwnldsOK+=1 dwnldsOK+=1
......
...@@ -18,7 +18,7 @@ from traceback import print_tb ...@@ -18,7 +18,7 @@ from traceback import print_tb
from django.shortcuts import redirect from django.shortcuts import redirect
from django.http import Http404, HttpResponseRedirect, HttpResponseForbidden from django.http import Http404, HttpResponseRedirect, HttpResponseForbidden
from gargantext.constants import RESOURCETYPES, QUERY_SIZE_N_MAX from gargantext.constants import resourcetype, QUERY_SIZE_N_MAX
from gargantext.models.nodes import Node from gargantext.models.nodes import Node
from gargantext.util.db import session from gargantext.util.db import session
from gargantext.util.db_cache import cache from gargantext.util.db_cache import cache
...@@ -134,7 +134,7 @@ def save( request , project_id ) : ...@@ -134,7 +134,7 @@ def save( request , project_id ) :
print(filename) print(filename)
if filename != False: if filename != False:
# add the uploaded resource to the corpus # add the uploaded resource to the corpus
corpus.add_resource( type = int(3) corpus.add_resource( type = resourcetype('Pubmed (XML format)')
, path = filename , path = filename
, url = None , url = None
) )
......
/* ==========================================================
* bootstrap-carousel.js v2.0.3
* http://twitter.github.com/bootstrap/javascript.html#carousel
* ==========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* CAROUSEL CLASS DEFINITION
* ========================= */
var Carousel = function (element, options) {
this.$element = $(element)
this.options = options
this.options.slide && this.slide(this.options.slide)
this.options.pause == 'hover' && this.$element
.on('mouseenter', $.proxy(this.pause, this))
.on('mouseleave', $.proxy(this.cycle, this))
}
Carousel.prototype = {
cycle: function (e) {
if (!e) this.paused = false
this.options.interval
&& !this.paused
&& (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
return this
}
, to: function (pos) {
var $active = this.$element.find('.active')
, children = $active.parent().children()
, activePos = children.index($active)
, that = this
if (pos > (children.length - 1) || pos < 0) return
if (this.sliding) {
return this.$element.one('slid', function () {
that.to(pos)
})
}
if (activePos == pos) {
return this.pause().cycle()
}
return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
}
, pause: function (e) {
if (!e) this.paused = true
clearInterval(this.interval)
this.interval = null
return this
}
, next: function () {
if (this.sliding) return
return this.slide('next')
}
, prev: function () {
if (this.sliding) return
return this.slide('prev')
}
, slide: function (type, next) {
var $active = this.$element.find('.active')
, $next = next || $active[type]()
, isCycling = this.interval
, direction = type == 'next' ? 'left' : 'right'
, fallback = type == 'next' ? 'first' : 'last'
, that = this
, e = $.Event('slide')
this.sliding = true
isCycling && this.pause()
$next = $next.length ? $next : this.$element.find('.item')[fallback]()
if ($next.hasClass('active')) return
if ($.support.transition && this.$element.hasClass('slide')) {
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
$next.addClass(type)
$next[0].offsetWidth // force reflow
$active.addClass(direction)
$next.addClass(direction)
this.$element.one($.support.transition.end, function () {
$next.removeClass([type, direction].join(' ')).addClass('active')
$active.removeClass(['active', direction].join(' '))
that.sliding = false
setTimeout(function () { that.$element.trigger('slid') }, 0)
})
} else {
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
$active.removeClass('active')
$next.addClass('active')
this.sliding = false
this.$element.trigger('slid')
}
isCycling && this.cycle()
return this
}
}
/* CAROUSEL PLUGIN DEFINITION
* ========================== */
$.fn.carousel = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('carousel')
, options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
if (!data) $this.data('carousel', (data = new Carousel(this, options)))
if (typeof option == 'number') data.to(option)
else if (typeof option == 'string' || (option = options.slide)) data[option]()
else if (options.interval) data.cycle()
})
}
$.fn.carousel.defaults = {
interval: 5000
, pause: 'hover'
}
$.fn.carousel.Constructor = Carousel
/* CAROUSEL DATA-API
* ================= */
$(function () {
$('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
var $this = $(this), href
, $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
, options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
$target.carousel(options)
e.preventDefault()
})
})
}(window.jQuery);
\ No newline at end of file
/* ===================================================
* bootstrap-transition.js v2.0.3
* http://twitter.github.com/bootstrap/javascript.html#transitions
* ===================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
$(function () {
"use strict"; // jshint ;_;
/* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
* ======================================================= */
$.support.transition = (function () {
var transitionEnd = (function () {
var el = document.createElement('bootstrap')
, transEndEventNames = {
'WebkitTransition' : 'webkitTransitionEnd'
, 'MozTransition' : 'transitionend'
, 'OTransition' : 'oTransitionEnd'
, 'msTransition' : 'MSTransitionEnd'
, 'transition' : 'transitionend'
}
, name
for (name in transEndEventNames){
if (el.style[name] !== undefined) {
return transEndEventNames[name]
}
}
}())
return transitionEnd && {
end: transitionEnd
}
})()
})
}(window.jQuery);
\ No newline at end of file
/*
* Customize as you want ;)
*/
// ============ < DEVELOPER OPTIONS > ============
var geomap=false;
var colorByAtt = false;
var twittertimeline = false;
var minimap=false;
var getAdditionalInfo=true;//for topPapers div
var mainfile = ["db.json"];
// // var mainfile = "api.json";
// var mainfile = [
// "data/2-Terms-Authors-300nodes.gexf",
// "data/0-terms-terms-MainNodes.gexf",
// "data/maziyar2.json",
// "data/3-Terms-Countries-300nodes.gexf",
// // "data/noclimatechange_mnodes.gexf",
// "data/20150518t1052_phylograph.json",
// // "data/phylograph_6.json",
// // "data/maziyar.json",
// // "data/20141128_GPs_03_bi.gexf",
// // "data/example.json",
// // "data/Elisa__Omodei.gexf",
// ];
// getUrlParam.file = window.location.origin+"/"+$("#graphid").html(); // garg exclusive
// var corpusesList = {} // garg exclusive -> corpus comparison
// getUrlParam.file = "data/testgraph.json";
if( isUndef(getUrlParam.field1) && isUndef(getUrlParam.field2) ) {
if($("#graphid").length>0) {
getUrlParam.file = window.location.origin+"/"+$("#graphid").html(); // just Garg
}
} else {
var current_url = window.location.origin+window.location.pathname+window.location.search
getUrlParam.file = current_url.replace(/project(.*?)corpus/g, "api/corpus").replace("explorer?","graph?")
}
// if($("#graphid").length>0) // just Garg
// getUrlParam.file = window.location.origin+"/"+$("#graphid").html(); // just Garg
var corpusesList = {}
var Clusters = [];
var dataFolderTree = {};
var gexfDict={};
var egonode = {}
var iwantograph = "";
var bridge={};
var external="";
//external="http://tina.iscpif.fr/explorerjs/";//Just if you want to use the server-apps from tina.server
bridge["forFilteredQuery"] = external+"php/bridgeClientServer_filter.php";
bridge["forNormalQuery"] = external+"php/bridgeClientServer.php";
var gexfDict={};
// gexfDict["data/terrorism/terrorism_mono.gexf"] = "[2001-2014] TERRORISM (1-partite graph)";
// gexfDict["data/terrorism/terrorism_bi.gexf"] = "[2001-2014] TERRORISM (2-partite graph)";
var field = {}
// field["data/20141128_GPs_03_bi.gexf"] = "ISItermsfirstindexing";
// field["data/20141215_GPs_04.gexf"] = "ISItermsfirstindexing";
// field["data/medq2/20141128_MED_02_bi.gexf"] = "ISItermsBigWL";
// field["data/medq2/20141128_MED_03_bi.gexf"] = "ISItermsBigWL";
// field["data/medq2/20141208_MED_Author_name-ISItermsjulien_index.gexf"] = "ISItermsjulien_index";
// field["data/medq1/20141208_MED_01_bi.gexf"] = "ISItermsfirstindex";
// field["data/terrorism/terrorism_mono.gexf"] = "ISItermsListV1";
// field["data/terrorism/terrorism_bi.gexf"] = "ISItermsListV1";
var ParseCustom = function () {};
var SigmaUtils = function () {};
var TinaWebJS = function () {};
var Relations = {}
var SystemStates = {}
SystemStates.level = true;
SystemStates.type = [ true ] //[ true , false ]; //social activated!
SystemStates.selections = [];
SystemStates.opposites = [];
ircNick="";
ircCHN="";
var catSoc = "Document";
var catSem = "NGram";
var sizeMult = [];
sizeMult[catSoc] = 0.0;
sizeMult[catSem] = 0.0;
var inactiveColor = '#666';
var startingNodeId = "1";
var minLengthAutoComplete = 1;
var maxSearchResults = 10;
var strSearchBar = "Search";
var cursor_size_min= 0;
var cursor_size= 10;
var cursor_size_max= 100;
var desirableTagCloudFont_MIN=12;
var desirableTagCloudFont_MAX=20;
var desirableNodeSizeMIN=1;
var desirableNodeSizeMAX=12;
var desirableScholarSize=6; //Remember that all scholars have the same size!
/*
*Three states:
* - true: fa2 running at start
* - false: fa2 stopped at start, button exists
* - "off": button doesn't exist, fa2 stopped forever
**/ var fa2enabled=false;//"off";
var stopcriteria = false;
var iterationsFA2=1000;
var seed=999999999;//defaultseed
var semanticConverged=false;
var fa2seconds = 4;
var showLabelsIfZoom=1.0;
var greyColor = "#9b9e9e";
// ============ < SIGMA.JS PROPERTIES > ============
var sigmaJsDrawingProperties = {
defaultLabelColor: 'black',
defaultLabelSize: 10,//in fact I'm using it as minLabelSize'
defaultLabelBGColor: '#fff',
defaultLabelHoverColor: '#000',
labelThreshold: 4,
labelSize: "proportional",
defaultEdgeType: 'curve',
borderSize: 2.5,//Something other than 0
nodeBorderColor: "default",//exactly like this
defaultNodeBorderColor: "black"//,//Any color of your choice
//defaultBorderView: "always"
};
var sigmaJsGraphProperties = {
minEdgeSize: 2,
maxEdgeSize: 4,
};
var sigmaJsMouseProperties = {
minRatio:0.1,
maxRatio: 50
};
// ============ < / SIGMA.JS PROPERTIES > ============
// ============ < / DEVELOPER OPTIONS > ============
// ============ < VARIABLES.JS > ============
//"http://webchat.freenode.net/?nick=Ademe&channels=#anoe"
var ircUrl="http://webchat.freenode.net/?nick="+ircNick+"&channels="+ircCHN;
var twjs="tinawebJS/";
var categories = {};
var categoriesIndex = [];
var wnws_buffer = null;
var gexf;
//var zoom=0;
var checkBox=false;
var overNodes=false;
var shift_key=false;
var NOW="A";
var PAST="--";
var swclickActual="";
var swclickPrev="";
var swMacro=true;
var socsemFlag=false;
var constantNGramFilter;
var lastFilter = []
lastFilter["#slidercat0nodesweight"] = {"orig":"-" , "last":"-"}
lastFilter["#slidercat1nodesweight"] = {"orig":"-" , "last":"-"}
lastFilter["#slidercat0edgesweight"] = {"orig":"-" , "last":"-"}
lastFilter["#slidercat1edgesweight"] = {"orig":"-" , "last":"-"}
var Filters = {}
var overviewWidth = 200;
var overviewHeight = 175;
var overviewScale = 0.25;
var overviewHover=false;
var moveDelay = 80, zoomDelay = 2;
//var Vecindad;
var partialGraph;
var otherGraph;
var Nodes = [];
var Edges = [];
var nodeslength=0;
var labels = [];
var numberOfDocs=0;
var numberOfNGrams=0;
var selections = [];
var deselections={};
var opossites = {};
var opos=[];
var oposMAX;
var matches = [];
var nodes1 = {};
var nodes2 = {};
var bipartiteD2N = {};
var bipartiteN2D = {};
var flag=0;
var firstime=0;
var leftright=true;
var edgesTF=false;
//This variables will be updated in sigma.parseCustom.js
var minNodeSize=1.00;
var maxNodeSize=5.00;
var minEdgeWeight=5.0;
var maxEdgeWeight=0.0;
//---------------------------------------------------
var bipartite=false;
var gexfDictReverse={}
for (var i in gexfDict){
gexfDictReverse[gexfDict[i]]=i;
}
var colorList = ["#000000", "#FFFF00", "#1CE6FF", "#FF34FF", "#FF4A46", "#008941", "#006FA6", "#A30059", "#FFDBE5", "#7A4900", "#0000A6", "#63FFAC", "#B79762", "#004D43", "#8FB0FF", "#997D87", "#5A0007", "#809693", "#FEFFE6", "#1B4400", "#4FC601", "#3B5DFF", "#4A3B53", "#FF2F80", "#61615A", "#BA0900", "#6B7900", "#00C2A0", "#FFAA92", "#FF90C9", "#B903AA", "#D16100", "#DDEFFF", "#000035", "#7B4F4B", "#A1C299", "#300018", "#0AA6D8", "#013349", "#00846F", "#372101", "#FFB500", "#C2FFED", "#A079BF", "#CC0744", "#C0B9B2", "#C2FF99", "#001E09", "#00489C", "#6F0062", "#0CBD66", "#EEC3FF", "#456D75", "#B77B68", "#7A87A1", "#788D66", "#885578", "#FAD09F", "#FF8A9A", "#D157A0", "#BEC459", "#456648", "#0086ED", "#886F4C","#34362D", "#B4A8BD", "#00A6AA", "#452C2C", "#636375", "#A3C8C9", "#FF913F", "#938A81", "#575329", "#00FECF", "#B05B6F", "#8CD0FF", "#3B9700", "#04F757", "#C8A1A1", "#1E6E00", "#7900D7", "#A77500", "#6367A9", "#A05837", "#6B002C", "#772600", "#D790FF", "#9B9700", "#549E79", "#FFF69F", "#201625", "#72418F", "#BC23FF", "#99ADC0", "#3A2465", "#922329", "#5B4534", "#FDE8DC", "#404E55", "#0089A3", "#CB7E98", "#A4E804", "#324E72", "#6A3A4C", "#83AB58", "#001C1E", "#D1F7CE", "#004B28", "#C8D0F6", "#A3A489", "#806C66", "#222800", "#BF5650", "#E83000", "#66796D", "#DA007C", "#FF1A59", "#8ADBB4", "#1E0200", "#5B4E51", "#C895C5", "#320033", "#FF6832", "#66E1D3", "#CFCDAC", "#D0AC94", "#7ED379", "#012C58"];
var RVUniformC = function(seed){
this.a=16807;
this.b=0;
this.m=2147483647;
this.u;
this.seed=seed;
this.x = this.seed;
// this.generar = function(n){
// uniforme = [];
// x = 0.0;
// x = this.seed;
// for(i = 1; i < n ; i++){
// x = ((x*this.a)+this.b)%this.m;
// uniforme[i] = x/this.m;
// }
// return uniforme;
// };
this.getRandom = function(){
x = ((this.x*this.a)+this.b)%this.m;
this.x = x;
this.u = this.x/this.m;
return this.u;
};
}
//unifCont = new RVUniformC(100000000)
This source diff could not be displayed because it is too large. You can view the blob instead.
<html> <html>
<head> <head>
{% load staticfiles %} {% load staticfiles %}
<link rel="stylesheet" href="{% static "css/bootstrap.css" %}"> <link rel="stylesheet" href="{% static "js/bootstrap/3.0.2/bootstrap.css" %}">
<link rel="stylesheet" href="{% static "css/bootstrap-theme.min.css" %}"> <link rel="stylesheet" href="{% static "js/bootstrap/3.1.1/bootstrap-theme.min.css" %}">
<link rel="stylesheet" href="{% static "js/jquery/1.11.2/jquery-ui.css" %}" media="screen">
<!-- TODO rationaliser les chemins sous libs -->
<link rel="stylesheet" href="{% static "js/libs/jquery/jquery-ui.css" %}" media="screen">
<!-- <link rel="stylesheet" href="{% static "js/libs/bootstrap/css/bootstrap.css" %}" media="screen"> -->
<link rel="stylesheet" href="{% static "js/libs/css2/freshslider.css" %}" media="screen"> <link rel="stylesheet" href="{% static "js/libs/css2/freshslider.css" %}" media="screen">
<link rel="stylesheet" href="{% static "js/libs/css2/custom.css" %}" media="screen"> <link rel="stylesheet" href="{% static "js/libs/css2/custom.css" %}" media="screen">
<link rel="stylesheet" href="{% static "js/libs/css2/sidebar.css" %}" media="screen"> <link rel="stylesheet" href="{% static "js/libs/css2/sidebar.css" %}" media="screen">
...@@ -76,22 +73,28 @@ ...@@ -76,22 +73,28 @@
{% if project %} {% if project %}
<li><a href="/projects/{{project.id}}"> <li><a href="/projects/{{project.id}}">
<span class="glyphicon glyphicon-book" aria-hidden="true"></span> <span class="glyphicon glyphicon-book" aria-hidden="true"></span>
{{project.name}}</a></li> {{project.name | truncatechars:15}}</a></li>
{% endif %} {% endif %}
{% if corpus %} {% if corpus %}
<li><a href="/projects/{{project.id}}/corpora/{{corpus.id}}"> <li><a href="/projects/{{project.id}}/corpora/{{corpus.id}}">
<span class="glyphicon glyphicon-file" aria-hidden="true"></span> <span class="glyphicon glyphicon-file" aria-hidden="true"></span>
{{corpus.name}} {{corpus.name | truncatechars:15}}
</a></li> </a></li>
{% endif %} {% endif %}
</ul> </ul>
<ul class="nav pull-right"> <ul class="nav pull-right">
<li class="dropdown"> <li class="dropdown">
<<<<<<< HEAD
<a href="#" role="button" class="dropdown-toggle navbar-text" data-toggle="dropdown" title="That is your username"> <a href="#" role="button" class="dropdown-toggle navbar-text" data-toggle="dropdown" title="That is your username">
<i class="icon-user"></i> <i class="icon-user"></i>
<span class="glyphicon glyphicon-user" aria-hidden="true" style="color:white"></span> <span class="glyphicon glyphicon-user" aria-hidden="true" style="color:white"></span>
{{ user.username | truncatechars:15}} {{ user.username | truncatechars:15}}
=======
<a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown" title="That is your login"><i class="icon-user"></i>
<span class="glyphicon glyphicon-user" aria-hidden="true" style="color:white"></span>
{{ user.username | truncatechars:15}}
>>>>>>> refactoring
<i class="caret"></i> <i class="caret"></i>
</a> </a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
...@@ -475,8 +478,8 @@ ...@@ -475,8 +478,8 @@
</div> </div>
<script src="{% static "js/jquery/jquery.min.js" %}" type="text/javascript"></script> <script src="{% static "js/jquery/1.11.1/jquery.min.js" %}" type="text/javascript"></script>
<script src="{% static "js/libs/jquery/jquery-ui.js" %}" type="text/javascript"></script> <script src="{% static "js/jquery/1.11.2/jquery-ui.js" %}" type="text/javascript"></script>
<script src="{% static "js/libs/jquery/jquery.ba-dotimeout.min.js" %}" type="text/javascript"></script> <script src="{% static "js/libs/jquery/jquery.ba-dotimeout.min.js" %}" type="text/javascript"></script>
<script src="{% static "js/libs/jquery/jquery.mousewheel.min.js" %}" type="text/javascript"></script> <script src="{% static "js/libs/jquery/jquery.mousewheel.min.js" %}" type="text/javascript"></script>
...@@ -493,11 +496,11 @@ ...@@ -493,11 +496,11 @@
<script src="{% static "js/tinawebJS/globalUtils.js" %}" type="text/javascript"></script> <script src="{% static "js/tinawebJS/globalUtils.js" %}" type="text/javascript"></script>
<script src="{% static "js/tinawebJS/plugins/jLouvain.js" %}" type="text/javascript"></script> <script src="{% static "js/tinawebJS/plugins/jLouvain.js" %}" type="text/javascript"></script>
<script src="{% static "js/tinawebJS/sigma.min.js" %}" type="text/javascript" language="javascript"></script> <script src="{% static "js/graphExplorer/sigma.min.js" %}" type="text/javascript" language="javascript"></script>
<script src="{% static "js/tinawebJS/sigma.forceatlas2.js" %}" type="text/javascript" language="javascript"></script> <script src="{% static "js/tinawebJS/sigma.forceatlas2.js" %}" type="text/javascript" language="javascript"></script>
<script src="{% static "js/settings_explorerjs.js" %}" type="text/javascript" language="javascript"></script> <script src="{% static "js/graphExplorer/settings_explorerjs.js" %}" type="text/javascript" language="javascript"></script>
<script src="{% static "js/tinawebJS/sigma.parseCustom.js" %}" type="text/javascript" language="javascript"></script> <script src="{% static "js/tinawebJS/sigma.parseCustom.js" %}" type="text/javascript" language="javascript"></script>
<script src="{% static "js/extras_explorerjs.js" %}" type="text/javascript" language="javascript"></script> <script src="{% static "js/graphExplorer/extras_explorerjs.js" %}" type="text/javascript" language="javascript"></script>
<script src="{% static "js/tinawebJS/sigmaUtils.js" %}" type="text/javascript" language="javascript"></script> <script src="{% static "js/tinawebJS/sigmaUtils.js" %}" type="text/javascript" language="javascript"></script>
<script src="{% static "js/tinawebJS/methods.js" %}" type="text/javascript" language="javascript"></script> <script src="{% static "js/tinawebJS/methods.js" %}" type="text/javascript" language="javascript"></script>
<script src="{% static "js/tinawebJS/minimap.js" %}" type="text/javascript" language="javascript"></script> <script src="{% static "js/tinawebJS/minimap.js" %}" type="text/javascript" language="javascript"></script>
......
<html> <html>
{% load staticfiles %}
<head> <head>
<link rel="stylesheet" type="text/css" href="/static/css/bootstrap.css"> <link rel="stylesheet" type="text/css" href="{% static "js/bootstrap/3.0.2/bootstrap.css" %}">
<link rel="stylesheet" type="text/css" href="/static/css/morris.css">
</head> </head>
<body> <body>
......
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
{% block css %} {% block css %}
{% load staticfiles %} {% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static "css/bootstrap.css" %}"> <link rel="stylesheet" type="text/css" href="{% static "js/bootstrap/3.0.2/bootstrap.css" %}">
<link rel="stylesheet" type="text/css" href="{% static "css/d3/dc.css"%}"/> <link rel="stylesheet" type="text/css" href="{% static "js/d3/dc.css"%}"/>
<link rel="stylesheet" type="text/css" href="{% static "css/jquery/jquery.dynatable.css"%}"/> <link rel="stylesheet" type="text/css" href="{% static "js/jquery/dynatable/jquery.dynatable.css"%}"/>
<link rel="stylesheet" type="text/css" href="{% static "css/gargantext/tables.css"%}"/> <link rel="stylesheet" type="text/css" href="{% static "js/gargantext/tables.css"%}"/>
<script type="text/javascript" src="{% static "js/d3/d3.js"%}"></script> <script type="text/javascript" src="{% static "js/d3/d3.js"%}"></script>
<script type="text/javascript" src="{% static "js/d3/crossfilter.js"%}"></script> <script type="text/javascript" src="{% static "js/d3/crossfilter.js"%}"></script>
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<center> <center>
Select a frequency group in the chart with blue bars to zoom in Select a frequency group in the chart with blue bars to zoom in
<p align="center"> <p align="center">
<a class="btn btn-xs btn-default" role="button" href="/chart/corpus/{{ corpus.id }}/data.csv">Save</a> <!--<a class="btn btn-xs btn-default" role="button" href="/chart/corpus/{{ corpus.id }}/data.csv">Save</a>--!>
<a class="btn btn-xs btn-default" href="javascript:volumeChart.filterAll();dc.redrawAll();">Reset</a></p> <a class="btn btn-xs btn-default" href="javascript:volumeChart.filterAll();dc.redrawAll();">Reset</a></p>
<!-- <p style="font-size:70%"> <!-- <p style="font-size:70%">
<b>x</b>: amount of documents for the journal <b>x</b>: amount of documents for the journal
...@@ -77,7 +77,7 @@ ...@@ -77,7 +77,7 @@
<script type="text/javascript" src="{% static "js/jquery/jquery.dynatable.js" %}"></script> <script type="text/javascript" src="{% static "js/jquery/dynatable/jquery.dynatable.js" %}"></script>
<!-- custom-lib for dynatable.js and dc.js --> <!-- custom-lib for dynatable.js and dc.js -->
<script type="text/javascript" src="{% static "js/gargantext/Journals_dyna_chart_and_table.js" %}"></script> <script type="text/javascript" src="{% static "js/gargantext/Journals_dyna_chart_and_table.js" %}"></script>
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
{% load staticfiles %} {% load staticfiles %}
{% block css %} {% block css %}
<link rel="stylesheet" type="text/css" href="{% static "css/d3/dc.css"%}"/> <link rel="stylesheet" type="text/css" href="{% static "js/d3/dc.css"%}"/>
<link rel="stylesheet" type="text/css" href="{% static "css/jquery/jquery.dynatable.css"%}"/> <link rel="stylesheet" type="text/css" href="{% static "js/jquery/dynatable/jquery.dynatable.css"%}"/>
<link rel="stylesheet" type="text/css" href="{% static "css/gargantext/tables.css"%}"/> <link rel="stylesheet" type="text/css" href="{% static "js/gargantext/tables.css"%}"/>
<script type="text/javascript" src="{% static "js/d3/d3.js"%}"></script> <script type="text/javascript" src="{% static "js/d3/d3.js"%}"></script>
<script type="text/javascript" src="{% static "js/d3/crossfilter.js"%}"></script> <script type="text/javascript" src="{% static "js/d3/crossfilter.js"%}"></script>
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
<center> <center>
Select a score/frequency range in the chart with blue bars to zoom in Select a score/frequency range in the chart with blue bars to zoom in
<p align="center"> <p align="center">
<a class="btn btn-xs btn-default" role="button" href="/chart/corpus/{{ corpus.id }}/data.csv">Save</a> <!--<a class="btn btn-xs btn-default" role="button" href="/chart/corpus/{{ corpus.id }}/data.csv">Save</a>--!>
<a class="btn btn-xs btn-default" href="javascript:volumeChart.filterAll();dc.redrawAll();">Reset</a></p> <a class="btn btn-xs btn-default" href="javascript:volumeChart.filterAll();dc.redrawAll();">Reset</a></p>
<div class="clearfix"></div> <div class="clearfix"></div>
</center> </center>
...@@ -105,7 +105,7 @@ ...@@ -105,7 +105,7 @@
--> -->
<script type="text/javascript" src="{% static "js/jquery/jquery.dynatable.js" %}"></script> <script type="text/javascript" src="{% static "js/jquery/dynatable/jquery.dynatable.js" %}"></script>
<!-- custom-lib for dynatable.js and dc.js --> <!-- custom-lib for dynatable.js and dc.js -->
<script type="text/javascript" src="{% static "js/gargantext/NGrams_dyna_chart_and_table.js" %}"></script> <script type="text/javascript" src="{% static "js/gargantext/NGrams_dyna_chart_and_table.js" %}"></script>
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
{% load staticfiles %} {% load staticfiles %}
{% block css %} {% block css %}
<link rel="stylesheet" type="text/css" href="{% static "css/d3/dc.css"%}"/> <link rel="stylesheet" type="text/css" href="{% static "js/d3/dc.css"%}"/>
<link rel="stylesheet" type="text/css" href="{% static "css/jquery/jquery.dynatable.css"%}"/> <link rel="stylesheet" type="text/css" href="{% static "js/jquery/dynatable/jquery.dynatable.css"%}"/>
<link rel="stylesheet" type="text/css" href="{% static "css/gargantext/tables.css"%}"/> <link rel="stylesheet" type="text/css" href="{% static "js/gargantext/tables.css"%}"/>
<script type="text/javascript" src="{% static "js/d3/d3.js"%}"></script> <script type="text/javascript" src="{% static "js/d3/d3.js"%}"></script>
<script type="text/javascript" src="{% static "js/d3/crossfilter.js"%}"></script> <script type="text/javascript" src="{% static "js/d3/crossfilter.js"%}"></script>
...@@ -20,9 +20,9 @@ ...@@ -20,9 +20,9 @@
<div class="col-md-3 col-md-offset-2"> <div class="col-md-3 col-md-offset-2">
<div id="monthly-move-chart"> <div id="monthly-move-chart">
<center> <center>
Select a time range in the chart with blue bars to zoom in Select a time range in the chart with blue bars to zoom in
<p align="center"> <p align="center">
<a class="btn btn-xs btn-default" role="button" href="/chart/corpus/{{ corpus.id }}/data.csv">Save</a> <!--<a class="btn btn-xs btn-default" role="button" href="/chart/corpus/{{ corpus.id }}/data.csv">Save</a>--!>
<a class="btn btn-xs btn-default" href="javascript:volumeChart.filterAll();dc.redrawAll();">Reset</a></p> <a class="btn btn-xs btn-default" href="javascript:volumeChart.filterAll();dc.redrawAll();">Reset</a></p>
<div class="clearfix"></div> <div class="clearfix"></div>
...@@ -89,7 +89,7 @@ ...@@ -89,7 +89,7 @@
</div> </div>
<!-- here goes import script js/bootstrap/bootstrap-multiselect.js, mais ca marche pas--> <!-- here goes import script js/bootstrap/bootstrap-multiselect.js, mais ca marche pas-->
<script type="text/javascript" src="{% static "js/jquery/jquery.dynatable.js" %}"></script> <script type="text/javascript" src="{% static "js/jquery/dynatable/jquery.dynatable.js" %}"></script>
<!-- custom-lib for dynatable.js and dc.js --> <!-- custom-lib for dynatable.js and dc.js -->
<script type="text/javascript" src="{% static "js/gargantext/Docs_dyna_chart_and_table.js" %}"></script> <script type="text/javascript" src="{% static "js/gargantext/Docs_dyna_chart_and_table.js" %}"></script>
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
{% block css %} {% block css %}
<script src="{% static "js/jquery/jquery.min.js" %}" type="text/javascript"></script> <script src="{% static "js/jquery/1.11.1/jquery.min.js" %}" type="text/javascript"></script>
{% endblock %} {% endblock %}
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
{% block css %} {% block css %}
<script src="{% static "js/jquery/jquery.min.js" %}" type="text/javascript"></script> <script src="{% static "js/jquery/1.11.1/jquery.min.js" %}" type="text/javascript"></script>
{% endblock %} {% endblock %}
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
<link href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&amp;lang=en" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&amp;lang=en" rel="stylesheet">
<!-- App CSS --> <!-- App CSS -->
<link type="text/css" href="{% static "css/login.min.css" %}" rel="stylesheet"> <link type="text/css" href="{% static "js/bootstrap/4.0.0/login.min.css" %}" rel="stylesheet">
</head> </head>
...@@ -74,10 +74,10 @@ ...@@ -74,10 +74,10 @@
</div> </div>
<!-- jQuery --> <!-- jQuery -->
<script src="{% static "js/jquery/jquery.min.js" %}"></script> <script src="{% static "js/jquery/1.11.1/jquery.min.js" %}"></script>
<!-- Bootstrap --> <!-- Bootstrap -->
<script src="{% static "js/bootstrap/bootstrap.min.js" %}"></script> <script src="{% static "js/bootstrap/3.2.0/bootstrap.min.js" %}"></script>
</body> </body>
......
...@@ -3,9 +3,9 @@ ...@@ -3,9 +3,9 @@
{% block css %} {% block css %}
{% load staticfiles %} {% load staticfiles %}
<link rel="stylesheet" href="{% static "css/bootstrap.css" %}"> <link rel="stylesheet" href="{% static "js/bootstrap/3.0.2/bootstrap.css" %}">
<script src="{% static "js/jquery/jquery.min.js" %}" type="text/javascript"></script> <script src="{% static "js/jquery/1.11.1/jquery.min.js" %}" type="text/javascript"></script>
{% endblock %} {% endblock %}
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
{% load staticfiles %} {% load staticfiles %}
<head> <head>
<link rel="shortcut icon" href="{% static "/favicon.ico" %}"> <link rel="shortcut icon" href="{% static "/favicon.ico" %}">
<script type="text/javascript" src="{% static "js/jquery/jquery.min.js" %}"></script> <script type="text/javascript" src="{% static "js/jquery/1.11.1/jquery.min.js" %}"></script>
<link rel="stylesheet" type="text/css" href="{% static "css/bootstrap.css" %}"> <link rel="stylesheet" type="text/css" href="{% static "js/bootstrap/3.0.2/bootstrap.css" %}">
<link rel="stylesheet" type="text/css" href="{% static "css/gargantext/menu.css"%}"/> <link rel="stylesheet" type="text/css" href="{% static "js/gargantext/menu.css"%}"/>
{% block css %} {% block css %}
{% endblock %} {% endblock %}
</head> </head>
...@@ -81,7 +81,7 @@ ...@@ -81,7 +81,7 @@
<li> <li>
<a type="button" class="btn btn-default {% if view == 'titles' %} active {% endif %}" <a type="button" class="btn btn-default {% if view == 'titles' %} active {% endif %}"
onclick="javascript:location.href='/projects/{{project.id}}/corpora/{{ corpus.id }}/'" onclick="javascript:location.href='/projects/{{project.id}}/corpora/{{ corpus.id }}/'"
data-target='#' href='#'>Titles data-target='#' href='#'>Documents
</a> </a>
</li> </li>
...@@ -220,7 +220,7 @@ ...@@ -220,7 +220,7 @@
<!-- <!--
<script type="text/javascript" src="{% static "js/easy/jquery.easypiechart.js"%}"></script> <script type="text/javascript" src="{% static "js/jquery/pie-chart/jquery.easypiechart.js"%}"></script>
<script type="text/javascript"> <script type="text/javascript">
$(function() { $(function() {
$('.chart').easyPieChart({ $('.chart').easyPieChart({
...@@ -231,7 +231,7 @@ ...@@ -231,7 +231,7 @@
</script> </script>
--> -->
<script type="text/javascript" src="{% static "js/bootstrap/bootstrap.min.js" %}"></script> <script type="text/javascript" src="{% static "js/bootstrap/3.2.0/bootstrap.min.js" %}"></script>
<script type="text/javascript"> <script type="text/javascript">
$(function () { $("[data-toggle='popover']").popover({ $(function () { $("[data-toggle='popover']").popover({
......
...@@ -3,16 +3,15 @@ ...@@ -3,16 +3,15 @@
{% block css %} {% block css %}
{% load staticfiles %} {% load staticfiles %}
<link rel="stylesheet" href="{% static "css/bootstrap.css" %}"> <link rel="stylesheet" href="{% static "js/bootstrap/3.0.2/bootstrap.css" %}">
<script type="text/javascript" src="{% static "js/jquery/jquery.min.js" %}"></script> <script type="text/javascript" src="{% static "js/jquery/1.11.1/jquery.min.js" %}"></script>
<script type="text/javascript" src="{% static "js/gargantext/garganrest.js" %}"></script> <script type="text/javascript" src="{% static "js/gargantext/garganrest.js" %}"></script>
<link rel="stylesheet" href="{% static "js/jquery/1.11.2/jquery-ui.css" %}"> <link rel="stylesheet" href="{% static "js/jquery/1.11.2/jquery-ui.css" %}">
<script type="text/javascript" src="{% static "js/morris.min.js" %}"></script> <script type="text/javascript" src="{% static "js/morris/morris.min.js" %}"></script>
<script type="text/javascript" src="{% static "js/morris.min.js" %}"></script> <link rel="stylesheet" href="{% static "js/morris/morris.css" %}">
<link rel="stylesheet" href="{% static "css/morris.css" %}">
<script src="{% static "js/raphael-min.js"%}"></script> <script src="{% static "js/raphael/raphael-min.js"%}"></script>
<style type="text/css"> <style type="text/css">
.ui-autocomplete { .ui-autocomplete {
z-index: 5000; z-index: 5000;
...@@ -79,32 +78,37 @@ ...@@ -79,32 +78,37 @@
<div id="project_{{project.id}}" class="row"> <div id="project_{{project.id}}" class="row">
<h3> <h3>
<a <div class="col-md-5 content">
href="/projects/{{ project.id }}"> <a
<span class="glyphicon glyphicon-book" aria-hidden="true"></span> href="/projects/{{ project.id }}">
{{ project.name }} <span class="glyphicon glyphicon-book" aria-hidden="true"></span>
</a> {{ project.name }}
<a href="/projects/{{project.id}}" > </a>
<button type="button" class="btn btn-default" aria-label="Left Align"> </div>
<span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span>
</button> <div class="col-md-3 content">
<a href="/projects/{{project.id}}" >
</a> <button type="button" class="btn btn-default" aria-label="Left Align">
<span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span>
<button type="button" class="btn btn-default" data-container="body" data-toggle="popover" data-placement="bottom" </button>
data-content=" <ul>
<!-- </a>
<li>Rename</li>
--!> <button type="button" class="btn btn-default" data-container="body" data-toggle="popover" data-placement="bottom"
<li onclick=&quot; data-content=" <ul>
garganrest.nodes.delete({{project.id}}, function(){$('#project_'+{{project.id}}).remove()}); <!--
$(this).parent().parent().remove(); <li>Rename</li>
&quot;><a href=&quot;#&quot;>Delete</a></li> --!>
</ul> <li onclick=&quot;
"> garganrest.nodes.delete({{project.id}}, function(){$('#project_'+{{project.id}}).remove()});
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span> $(this).parent().parent().remove();
</button> &quot;><a href=&quot;#&quot;>Delete</a>
</li> </li>
</ul>
">
<span class="glyphicon glyphicon-trash pull-right" aria-hidden="true"></span>
</button>
</div>
{% if common_users %} {% if common_users %}
<!-- <a style="cursor:pointer;"><img class="share_button" data-id="{{ project.id }}" title="Share it!" width="20px" src="{% static "img/share.png" %}"></img></a> --!> <!-- <a style="cursor:pointer;"><img class="share_button" data-id="{{ project.id }}" title="Share it!" width="20px" src="{% static "img/share.png" %}"></img></a> --!>
{% endif %} {% endif %}
......
This diff is collapsed.
...@@ -3,9 +3,9 @@ ...@@ -3,9 +3,9 @@
{% block css %} {% block css %}
{% load staticfiles %} {% load staticfiles %}
<link rel="stylesheet" href="{% static "css/bootstrap.css" %}"> <link rel="stylesheet" href="{% static "js/bootstrap/3.0.2/bootstrap.css" %}">
<script src="{% static "js/jquery/jquery.min.js" %}" type="text/javascript"></script> <script src="{% static "js/jquery/1.11.1/jquery.min.js" %}" type="text/javascript"></script>
{% endblock %} {% endblock %}
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<div class="jumbotron"> <div class="jumbotron">
<h2>Your file has been uploaded ! </h2> <h2>Your file has been uploaded ! </h2>
<h2>Gargantext need some time to eat it.</h2> <h2>Gargantext need some time to eat it.</h2>
<h2>Duration depends on the size of the plate of texts you gave him.</h2> <h2>Duration depends on the size of the dish.</h2>
<a class="btn btn-primary btn-lg" href="/projects/{{ project.id }}" title="Click and test by yourself">Continue on Gargantext</a> <a class="btn btn-primary btn-lg" href="/projects/{{ project.id }}" title="Click and test by yourself">Continue on Gargantext</a>
</div> </div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment