Commit 26992806 authored by Romain Loth's avatar Romain Loth

new orgs DB structure: adapted php main SELECTs, php/js charts and php directory content

parent 4f53c2b8
......@@ -121,12 +121,17 @@ Full table structure is described in [this documentation file](https://github.co
-- ==========================
SELECT
scholars.*,
affiliations.*,
orgs.*
FROM scholars
LEFT JOIN sch_org
ON luid = sch_org.uid
JOIN orgs
ON orgs.orgid = sch_org.orgid
ON orgs.orgid = sch_org.orgid ;
-- NB: scholars <=> orgs is a one-to-many relationship
-- so this can return multiple lines
-- => in the app we use GROUP_CONCAT(orgs.tostring)
-- to fit in the scholars cardinality)
-- ==================================
......
-- When we want all scholars info as one row
-- (typically in generic filters/directories),
-- then we need to use this kind of CASCADED left joins
-- because we have several one-to-many relationships in normal form
SELECT * FROM (
SELECT
scholars_orgs_and_keywords.*,
GROUP_CONCAT(htstr) AS hashtags_list
FROM (
SELECT
scholars_and_orgs.*,
GROUP_CONCAT(kwstr) AS keywords_list
FROM (
SELECT
scholars_and_labs.*,
-- GROUP_CONCAT(insts.orgid SEPARATOR ',') AS insts_ids,
GROUP_CONCAT(insts.tostring SEPARATOR '%%%') AS insts_list
FROM (
SELECT
scholars.*,
-- GROUP_CONCAT(labs.orgid SEPARATOR ',') AS labs_ids,
GROUP_CONCAT(labs.tostring SEPARATOR '%%%') AS labs_list
FROM scholars
LEFT JOIN sch_org AS map_labs
ON map_labs.uid = luid
JOIN orgs AS labs
ON map_labs.orgid = labs.orgid
WHERE (record_status = 'active'
OR (record_status = 'legacy' AND valid_date >= NOW()))
AND labs.class = 'lab'
GROUP BY luid
) AS scholars_and_labs
LEFT JOIN sch_org AS map_insts
ON map_insts.uid = luid
JOIN orgs AS insts
ON map_insts.orgid = insts.orgid
AND insts.class = 'inst'
GROUP BY luid
) AS scholars_and_orgs
LEFT JOIN sch_kw
ON sch_kw.uid = scholars_and_orgs.luid
LEFT JOIN keywords
ON sch_kw.kwid = keywords.kwid
GROUP BY luid
) AS scholars_orgs_and_keywords
LEFT JOIN sch_ht
ON sch_ht.uid = luid
LEFT JOIN hashtags
ON sch_ht.htid = hashtags.htid
GROUP BY luid
) AS full_scholars_info
WHERE luid = 2299 ;
......@@ -5,8 +5,6 @@
* and open the template in the editor.
*/
$a="UMR 1091 INRA/AgroParisTech Environnement et Grandes Cultures, ";
function clean_exp($string){
// enlève les comma trainantes
if (strcmp(substr(trim($string),-1),',')==0){
......@@ -16,6 +14,26 @@ function clean_exp($string){
}
}
function esc_html($string){
return htmlspecialchars($string,ENT_HTML5, 'UTF-8') ;
}
// -----------------------------8<------------------
// to clean alternative null values during DB transition
// TODO remove when DB finalized and refilled by returning users
// NB The only fields which can have it are lab name and sch position
// (both become mandatory but may not be filled for legacy users)
function weedout_alt_nulls($a_db_string) {
if (preg_match ('/^_NULL/', $a_db_string)) {
return null;
}
else {
return $a_db_string;
}
}
// -----------------------------8<------------------
// NB actually (2016-12) this is unused TODO use !!!
function get_value($cle_value,$table='data',$cle='cle',$valeur='valeur'){
......
This diff is collapsed.
......@@ -52,22 +52,24 @@ foreach ($jobs as $job) {
$content .= '<dt>Location: '. '</dt>';
$content .= '<dd><strong>Country:</strong> ' . $job['country'] . '</dd>';
}
$affiliation = '';
if ($job['lab'] != null) {
$content .= '<dd><strong>' . clean_exp('Lab:</strong> '.$job['lab']) . '</dd> ';
$lab_list[]=$job['lab'];
}
if ($job['organization'] != null) {
$content .= '<dd><strong>' . clean_exp('Organization:</strong> '.$job['organization']) . '</dd> ';
$orga_list[]=$job['organization'];
//echo $job['affiliation'].'<br/>';
//$lab_query.='OR name="'.$job['affiliation'].'" ';
}
if (($job['organization'] != null) | ($job['lab'] != null)) {
$content .= '<dd>' . clean_exp($affiliation) . '</dd> ';
}
$affiliation = '';
// FIXME old lab/institution data structures
// if ($job['lab'] != null) {
// $content .= '<dd><strong>' . clean_exp('Lab:</strong> '.$job['lab']) . '</dd> ';
// $lab_list[]=$job['lab'];
// }
// if ($job['organization'] != null) {
// $content .= '<dd><strong>' . clean_exp('Organization:</strong> '.$job['organization']) . '</dd> ';
// $orga_list[]=$job['organization'];
//
// //echo $job['affiliation'].'<br/>';
//
// //$lab_query.='OR name="'.$job['affiliation'].'" ';
// }
// if (($job['organization'] != null) | ($job['lab'] != null)) {
// $content .= '<dd>' . clean_exp($affiliation) . '</dd> ';
// }
$affiliation2 = '';
......
......@@ -5,19 +5,29 @@
* and open the template in the editor.
*/
// paramters : threshold to display orgs (labs / institutions) diagrams
$MIN_DISTINCT_LABS = 5 ;
$MIN_DISTINCT_INSTS = 4 ;
$country_list = array();
$position_list = array();
$title_list = array();
$organizations_list = array();
$labs_list = array();
$insts_list = array();
$other_country = 0;
$other_title = 0;
$other_position = 0;
$other_organization = 0;
$other_labs = 0;
$other_insts = 0;
$missing_country = 0;
$missing_title = 0;
$missing_position = 0;
$missing_affiliation = 0;
$missing_labs = 0;
$missing_insts = 0;
// données des pays
foreach ($scholars as $row) {
......@@ -29,6 +39,7 @@ foreach ($scholars as $row) {
}
}
// traitement des postes
// TODO supprimer, l'essentiel est fait/à faire en amont à l'enregistrement
$position = strtolower(trim($row["position"]));
if (strcmp($position, "prof.") == 0) {
$position = "";
......@@ -80,7 +91,7 @@ foreach ($scholars as $row) {
if (strcmp(substr($title, -1), ".") != 0) {
$title.=".";
}
// TODO supprimer, l'essentiel est fait/à faire en amont à l'enregistrement
if (strcmp($title, "Dr.") == 0) {
$title = "PhD.";
} elseif (strcmp(str_replace (' ','',str_replace ('.','', strtolower($title))), "phd") == 0) {
......@@ -102,35 +113,40 @@ foreach ($scholars as $row) {
}
}
// traitement des organismes de rattachement
$affiliation = trim($row["affiliation"] ?? "");
// TODO RESTORE NON NULL affiliation
if (strcmp($affiliation, "") == 0 || $affiliation == "_NULL") {
$missing_affiliation+=1;
} else {
if (array_key_exists($affiliation, $organizations_list)) {
$organizations_list[$affiliation]+=1;
} else {
$organizations_list[$affiliation] = 1;
// split et recensement des organismes de rattachement
// 1- labos
foreach ($row['labs'] as $lab) {
$lab = trim($lab);
// POSS ideally restore NON NULL labs
// but some users never provided any
if (strcmp($lab, "") == 0 || preg_match('/^_NULL/', $lab)) {
$missing_labs+=1;
}
else {
// >> $labs_list counts
if (array_key_exists($lab, $labs_list)) {
$labs_list[$lab]+=1;
} else {
$labs_list[$lab] = 1;
}
}
}
// 2 - same for institutions
foreach ($row['institutions'] as $inst) {
$inst = trim($inst);
if (strcmp($inst, "") == 0 || preg_match('/^_NULL/', $inst)) {
$missing_insts+=1;
}
else {
// >> $insts_list counts
if (array_key_exists($inst, $insts_list)) {
$insts_list[$inst]+=1;
} else {
$insts_list[$inst] = 1;
}
}
}
// $affiliation2 = trim($row["affiliation2"] ?? "");
//
// if (strcmp($affiliation2, "") == 0) {
// $missing_affiliation+=1;
// } else {
//
// if (array_key_exists($affiliation2, $organizations_list)) {
// $organizations_list[$affiliation2]+=1;
// } else {
// $organizations_list[$affiliation2] = 1;
//
// }
// }
}
......@@ -138,13 +154,21 @@ foreach ($scholars as $row) {
asort($country_list);
asort($position_list);
asort($title_list);
asort($organizations_list);
asort($labs_list);
asort($insts_list);
// TODO factorize all this
// NB escaping: no need to do htmlspeciazlchars($key, ENT_HTML5 | ENT_QUOTES, 'UTF-8'); because the target language is js (doesn't need html entities)
// données des pays
$country_data = "data: [";
foreach ($country_list as $key => $value) {
$key = addslashes($key);
if ($value > min(9, count($country_list) / 10)) {
$country_data.='["' . $key . '",' . $value . '],';
} else {
......@@ -170,6 +194,7 @@ $country_data.=']';
// données des position
$position_data = "data: [";
foreach ($position_list as $key => $value) {
$key = addslashes($key);
if ($value > min(9, count($position_list) / 10)) {
$position_data.='["' . $key . '",' . $value . '],';
} else {
......@@ -191,6 +216,7 @@ $position_data.=']';
// données des title
$title_data = "data: [";
foreach ($title_list as $key => $value) {
$key = addslashes($key);
if ($value > 3) {
$title_data.='["' . $key . '",' . $value . '],';
} else {
......@@ -210,29 +236,62 @@ $title_data.=']';
// données des institutions/affiliations
$organizations_data = "data: [";
foreach ($organizations_list as $key => $value) {
$labs_data = "data: [";
$n_labs = count($labs_list);
$n_shown_labs = 0 ;
foreach ($labs_list as $key => $value) {
$key = addslashes($key);
if ($value > min(9, $n_labs / 15)) {
$labs_data.='["' . $key . '",' . $value . '],';
$n_shown_labs += 1;
} else {
$other_labs+=$value;
}
}
if ($missing_labs>0){
$labs_data.='["Missing data",' . $missing_labs . '],';
}
if ($other_labs>0){
$labs_data.='["Others",' . $other_labs . ']';
} else {
$labs_data = substr($labs_data, 0, -1);
}
$labs_data.=']';
$htmlsafe_key = htmlspecialchars($key, ENT_XML1 | ENT_COMPAT, 'UTF-8');
if ($value > min(9, count($organizations_list) / 15)) {
$organizations_data.='["' . $htmlsafe_key . '",' . $value . '],';
$insts_data = "data: [";
$n_insts = count($insts_list);
$n_shown_insts = 0 ;
foreach ($insts_list as $key => $value) {
$key = addslashes($key);
if ($value > min(9, $n_insts / 15)) {
$insts_data.='["' . $key . '",' . $value . '],';
$n_shown_insts += 1;
} else {
$other_organization+=$value;
$other_insts+=$value;
}
}
if ($missing_affiliation>0){
$organizations_data.='["Missing data",' . $missing_affiliation . '],';
if ($missing_insts>0){
$insts_data.='["Missing data",' . $missing_insts . '],';
}
if ($other_organization>0){
$organizations_data.='["Others",' . $other_organization . ']';
if ($other_labs>0){
$insts_data.='["Others",' . $other_insts . ']';
} else {
$organizations_data = substr($organizations_data, 0, -1);
// removes the last ',' from line 257 or 264
$insts_data = substr($insts_data, 0, -1);
}
$organizations_data.=']';
$insts_data.=']';
// TODO separate this Highcharts js to factorize and expose as functions
// (or replace it by D3 and also separate)
$stats = '<script type="text/javascript">
var country;
var position;
......@@ -341,44 +400,89 @@ $(document).ready(function() {
},
series: [{
type: "pie",
name: "Titles",' . $title_data
. '}]
name: "Titles",' . $title_data .
'}]
});
organization= new Highcharts.Chart({
chart: {
renderTo: "organizations",
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false
},
title: {
text: "Affiliations"
},
tooltip: {
formatter: function() {
return "<b>"+ this.point.name +"</b>: "+ Math.floor(10*this.percentage)/10 +" %";
}
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: "pointer",
dataLabels: {
enabled: true,
color: "#000000",
connectorColor: "#000000",
formatter: function() {
return "<b>"+ this.point.name +"</b>: "+ Math.floor(10*this.percentage)/10 +" %";
}
}
}
},
series: [{
type: "pie",
name: "Affiliations",' . $organizations_data
. '}]
});
if (parseInt('.$n_shown_labs.') >= parseInt('.$MIN_DISTINCT_LABS.')) {
labs= new Highcharts.Chart({
chart: {
renderTo: "labs_div",
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false
},
title: {
text: "Laboratories affiliations"
},
tooltip: {
formatter: function() {
return "<b>"+ this.point.name +"</b>: "+ Math.floor(10*this.percentage)/10 +" %";
}
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: "pointer",
dataLabels: {
enabled: true,
color: "#000000",
connectorColor: "#000000",
formatter: function() {
return "<b>"+ this.point.name +"</b>: "+ Math.floor(10*this.percentage)/10 +" %";
}
}
}
},
series: [{
type: "pie",
name: "Lab Affiliations",' . $labs_data . '}]
});
}
else {
document.getElementById("labs_div").style.display = "none"
}
if (parseInt('.$n_shown_insts.') >= parseInt('.$MIN_DISTINCT_INSTS.')) {
insts= new Highcharts.Chart({
chart: {
renderTo: "insts_div",
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false
},
title: {
text: "Institutional affiliations"
},
tooltip: {
formatter: function() {
return "<b>"+ this.point.name +"</b>: "+ Math.floor(10*this.percentage)/10 +" %";
}
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: "pointer",
dataLabels: {
enabled: true,
color: "#000000",
connectorColor: "#000000",
formatter: function() {
return "<b>"+ this.point.name +"</b>: "+ Math.floor(10*this.percentage)/10 +" %";
}
}
}
},
series: [{
type: "pie",
name: "Institutional Affiliations",' . $insts_data . '}]
});
}
else {
document.getElementById("insts_div").style.display = "none"
}
});
......
......@@ -196,6 +196,8 @@ if ($countries) {
}
// £TODO_ORGS FILTER x 2
if ($laboratories) {
// debug
// echo '<p style="color:white">MATCHING ON labs<p>';
......@@ -257,7 +259,7 @@ $imsize = 150;
$content='';
error_log("=======> WHERE filters {$f}");
// error_log("=======> WHERE filters {$f}");
// filtered query
if (strlen($f)>0) {
......@@ -267,33 +269,54 @@ if (strlen($f)>0) {
else {
$filter = "";
}
// about the query stucture cf. doc/cascade_full_scholar_info.sql
$sql = <<< END_QUERY
SELECT * FROM (
SELECT
scholars_affiliations_and_keywords.*,
scholars_orgs_and_keywords.*,
GROUP_CONCAT(htstr) AS hashtags_list
FROM (
SELECT
scholars_and_affiliations.*,
scholars_and_orgs.*,
GROUP_CONCAT(kwstr) AS keywords_list
FROM (
SELECT
scholars.*,
affiliations.*
FROM scholars
LEFT JOIN affiliations
ON scholars.affiliation_id = affiliations.affid
WHERE (record_status = 'active'
OR (record_status = 'legacy' AND valid_date >= NOW()))
) AS scholars_and_affiliations
scholars_and_labs.*,
-- GROUP_CONCAT(insts.orgid SEPARATOR ',') AS insts_ids,
GROUP_CONCAT(insts.tostring SEPARATOR '%%%') AS insts_list
FROM (
SELECT
scholars.*,
-- GROUP_CONCAT(labs.orgid SEPARATOR ',') AS labs_ids,
GROUP_CONCAT(labs.tostring SEPARATOR '%%%') AS labs_list
FROM scholars
LEFT JOIN sch_org AS map_labs
ON map_labs.uid = luid
JOIN orgs AS labs
ON map_labs.orgid = labs.orgid
WHERE (record_status = 'active'
OR (record_status = 'legacy' AND valid_date >= NOW()))
AND labs.class = 'lab'
GROUP BY luid
) AS scholars_and_labs
LEFT JOIN sch_org AS map_insts
ON map_insts.uid = luid
JOIN orgs AS insts
ON map_insts.orgid = insts.orgid
AND insts.class = 'inst'
GROUP BY luid
) AS scholars_and_orgs
LEFT JOIN sch_kw
ON sch_kw.uid = scholars_and_affiliations.luid
ON sch_kw.uid = scholars_and_orgs.luid
LEFT JOIN keywords
ON sch_kw.kwid = keywords.kwid
GROUP BY luid
) AS scholars_affiliations_and_keywords
) AS scholars_orgs_and_keywords
LEFT JOIN sch_ht
ON sch_ht.uid = luid
LEFT JOIN hashtags
......@@ -312,7 +335,6 @@ $scholars = array();
//$query = "SELECT * FROM scholars";
foreach ($base->query($sql) as $row) {
$info = array();
$info['unique_id'] = $row['luid'];
$info['doors_uid'] = $row['doors_uid'];
......@@ -322,7 +344,7 @@ foreach ($base->query($sql) as $row) {
$info['initials'] = $row['initials'];
// retrieved from secondary table and GROUP_CONCATenated
$info['keywords_ids'] = explode(',', $row['keywords_ids']);
// $info['keywords_ids'] = explode(',', $row['keywords_ids']);
$info['nb_keywords'] = $row['keywords_nb'];
$info['keywords'] = split_join_keywords_for_html($row['keywords_list']);
......@@ -333,19 +355,10 @@ foreach ($base->query($sql) as $row) {
$info['country'] = $row['country'];
$info['homepage'] = $row['home_url'];
// recreated arrays
$info['labs'] = explode('%%%', $row['labs_list'] ?? "") ;
$info['institutions'] = explode('%%%', $row['insts_list'] ?? "") ;
// TODO recreate difference between lab and org --------->8--------
// $info['lab'] = $row['team_lab'];
// $info['affiliation'] = $row['org'];
// right now duplicate treatment short-circuited like this
// (effect visible in stat-prep_from_array)
$info['affiliation'] = $row['org'] . " " . $row['team_lab'];
$info['affiliation_id'] = $row['affiliation_id'];
// ----------------------------------------------------->8---------
// $info['lab2'] = $row['lab2'];
// $info['affiliation2'] = $row['affiliation2'];
$info['title'] = $row['hon_title'];
$info['position'] = $row['position'];
$info['pic_src'] = $row['pic_fname'] ? '/data/shared_user_img/'.$row['pic_fname'] : $row['pic_url'] ;
......@@ -359,16 +372,16 @@ foreach ($base->query($sql) as $row) {
// $info['affiliation_acronym'] = $row['affiliation_acronym'];
$scholars[$row['luid']] = $info;
}
/// stats
// creates js for stats visualisations
include ("php_library/stat-prep_from_array.php");
// debug
// $content .= var_dump($scholars) ;
// creates listing
include ("php_library/directory_content.php");
// liste des chercheurs
......@@ -453,7 +466,11 @@ Contributions and ideas are welcome to improve this directory.
<div id="country" style="width: 800px; height: 300px; margin: 0 auto"></div>
<div id="title" style="width: 800px; height: 300px; margin: 0 auto"></div>
<div id="position" style="width: 800px; height: 300px; margin: 0 auto"></div>
<div id="organizations" style="width: 800px; height: 300px; margin: 0 auto"></div>
<!-- these two are displayed only if the distribution has
at least 3 big groups (cf. n_shown in stats-prep) -->
<div id="labs_div" style="width: 800px; height: 300px; margin: 0 auto"></div>
<div id="insts_div" style="width: 800px; height: 300px; margin: 0 auto"></div>
<br/>
......
......@@ -105,23 +105,42 @@ if ($userid) {
// implementation with all details and infos to retrieve
$sql = <<< HERE_QUERY
SELECT
scholars_and_affiliations.*,
scholars_and_orgs.*,
COUNT(keywords.kwid) AS keywords_nb,
GROUP_CONCAT(keywords.kwid) AS keywords_ids,
GROUP_CONCAT(kwstr) AS keywords_list
FROM (
SELECT
scholars.*,
affiliations.*
FROM scholars
LEFT JOIN affiliations
ON scholars.affiliation_id = affiliations.affid
WHERE (record_status = 'active'
OR (record_status = 'legacy' AND valid_date >= NOW()))
) AS scholars_and_affiliations
scholars_and_labs.*,
-- GROUP_CONCAT(insts.orgid SEPARATOR ',') AS insts_ids,
GROUP_CONCAT(insts.tostring SEPARATOR '%%%') AS insts_list
FROM (
SELECT
scholars.*,
-- GROUP_CONCAT(labs.orgid SEPARATOR ',') AS labs_ids,
GROUP_CONCAT(labs.tostring SEPARATOR '%%%') AS labs_list
FROM scholars
LEFT JOIN sch_org AS map_labs
ON map_labs.uid = luid
JOIN orgs AS labs
ON map_labs.orgid = labs.orgid
WHERE (record_status = 'active'
OR (record_status = 'legacy' AND valid_date >= NOW()))
AND labs.class = 'lab'
GROUP BY luid
) AS scholars_and_labs
LEFT JOIN sch_org AS map_insts
ON map_insts.uid = luid
JOIN orgs AS insts
ON map_insts.orgid = insts.orgid
AND insts.class = 'inst'
GROUP BY luid
) AS scholars_and_orgs
LEFT JOIN sch_kw AS second_level
ON second_level.uid = scholars_and_affiliations.luid
ON second_level.uid = scholars_and_orgs.luid
JOIN sch_kw ON sch_kw.kwid = second_level.kwid
JOIN keywords
ON sch_kw.kwid = keywords.kwid
......@@ -155,8 +174,8 @@ HERE_QUERY;
// TODO recreate difference between lab and org --------->8--------
// $info['lab'] = $row['team_lab'];
// $info['affiliation'] = $row['org'];
$info['labs'] = explode('%%%', $row['labs_list'] ?? "") ;
$info['institutions'] = explode('%%%', $row['insts_list'] ?? "") ;
// right now duplicate treatment short-circuited like this
// (effect visible in stat-prep_from_array)
......@@ -168,7 +187,6 @@ HERE_QUERY;
$info['title'] = $row['hon_title'];
$info['position'] = $row['position'];
$info['pic_src'] = $row['pic_fname'] ? '/data/shared_user_img/'.$row['pic_fname'] : $row['pic_url'] ;
$info['pic_fname'] = $row['pic_fname'];
$info['interests'] = $row['interests_text'];
// $info['address'] = $row['address'];
// $info['city'] = $row['city'];
......@@ -182,12 +200,13 @@ HERE_QUERY;
}
/// stats
// creates js for stats visualisations
include ("php_library/stat-prep_from_array.php");
// debug
// $content .= var_dump($scholars) ;
// creates listing
include ("php_library/directory_content.php");
......
......@@ -50,7 +50,7 @@ CREATE TABLE locs(
CREATE TABLE orgs(
orgid int(15) not null auto_increment,
name varchar(120), -- full name
acro varchar(20), -- acronym or short name
acro varchar(30), -- acronym or short name
class varchar(25), -- "team|lab|inst"
-- like the calibre of the organization
......
SELECT scholars.first_name, scholars.last_name,
GROUP_CONCAT(labs.tostring SEPARATOR '/') AS labs_list,
GROUP_CONCAT(insts.tostring SEPARATOR '/') AS insts_list
FROM scholars
LEFT JOIN sch_org AS map_labs
ON map_labs.uid = luid
JOIN orgs AS labs
ON map_labs.orgid = labs.orgid
LEFT JOIN sch_org AS map_insts
ON map_insts.uid = luid
JOIN orgs AS insts
ON map_insts.orgid = insts.orgid
WHERE labs.class = 'lab'
AND insts.class = 'inst'
AND luid IN (3794,3779,2638,3704)
GROUP BY luid ;
--
-- +------------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-- | first_name | last_name | labs_list | insts_list |
-- +------------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-- | David | Chavalarias | Institut des Systèmes Complexes de Paris Ile-de-France (ISCPIF), Paris, France | Centre National de la Recherche Scientifique (CNRS), France |
-- | Paul | Bourgine | Centre de Recherche en Epistémologie Appliquée (CREA), /Centre de Recherche en Epistémologie Appliquée (CREA), | Ecole Polytechnique (X), Palaiseau, France/Centre National de la Recherche Scientifique (CNRS), France |
-- | Pierre | Magistry | Analyse Linguistique Profonde A Grande Echelle (ALPAGE), Paris, France/Analyse Linguistique Profonde A Grande Echelle (ALPAGE), Paris, France | Université Paris 7 – Diderot (Paris 7), Paris, France/Institut National de Recherche en Informatique et Automatique (INRIA), France |
-- | Samuel | Castillo | Institut des Systèmes Complexes de Paris Ile-de-France (ISCPIF), Paris, France | Centre National de la Recherche Scientifique (CNRS), France |
-- +------------+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
......@@ -345,6 +345,16 @@ div.ccsection-footer {
list-style: none;
}
/*in directory view*/
.labs-of-scholar {
font-family: Georgia, Cambria, serif;
}
.institutions-of-scholar {
font-family: Georgia, Cambria, serif;
font-weight: bold;
}
/**/
.bigger {
font-size: 150%;
......
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