Skip to content

Εβδομάδα 5: Προβολή της σελίδας της Wikipedia για κάποιο έμβιο ον και αναζήτηση για κάποιο συγκεκριμένο έμβιο ον

Golfo Vasiliou edited this page Sep 30, 2015 · 3 revisions

#Προβολή της σελίδας της Wikipedia για κάποιο έμβιο ον και αναζήτηση για κάποιο συγκεκριμένο έμβιο ον 23/09/2015 - 29/09/2015


Αυτή τη βδομάδα έγινε υλοποίηση της προβολής της σελίδας της wikipedia για κάποιο έμβιο ον ή τάξη. Ο κώδικας της σελίδας βρίσκεται στο αρχείο article.html. Αν ο χρήστης πατήσει κάποια εικόνα μπορεί να τη δει σε lightbox (υλοποιημένο με το plugin lity). Screenshot for week 5
Τα περιεχόμενα της σελίδας λαμβάνονται ή δημιουργούνται δυναμικά και τοποθετούνται στα παρακάτω divs.

 <div class="container-fluid" id="article_container">
 <div class="row">
 
  <div  class="col-sm-2" ><div id="statistics"><p id="totalNumber"></p><p><canvas id="myChart" width="200" height="200"></canvas></p><p id="current"></p></div></div>
 <div class="col-sm-7" ><div id="article" ></div></div>
<div class="col-sm-3" ><div id="custom_info"></div></div>

</div>
</div>

Ο χρήστης μεταβαίνει στο πλήρες άρθρο της wikipedia όταν πατήσει τον αντίστοιχο σύνδεσμο. Screenshot for week 5 Η μεταφορά δεδομένων από σελίδα σε σελίδα, αλλά και η διατήρηση των δεδομένων μέχρι ο χρήστης να κλείσει το browser γίνεται με τη χρήση μεταβλητών sessionStorage.
Όταν ο χρήστης επιλέγει να δει λεπτομέρειες για κάποιο ον, αποθηκεύονται σε sessionStorage το όνομα του και η βαθμίδα του.

$(document).on("click", ".details", function() {


    var name = getName($(this));
    var rank = getRank($(this));
	console.log('rank'+rank);
	name =name.replace(/ /g,"_");

    var img_url = $(this).closest('.thumbnail').find('img').attr('src');

    var title = $(this).closest('.thumbnail').find('.caption').children().first().text();
    query = getSummaryQuery(name);

 sessionStorage.setItem('title',title);
 sessionStorage.setItem('rank',rank);

    var queryUrl = query;
    $.ajax({
        dataType: "jsonp",
        url: queryUrl,
        rank: rank,
        img_url: img_url,
        title: title,
        name: name,
        success: summarySuccess
    });
});

Όταν ο χρήστης ανοίγει κάποιο από τους κόμβους του δέντρου, αποθηκεύεται το περιεχόμενο της σελίδας ώστε να διατηρηθεί σταθερό όσο ο χρήστης έχει ανοιχτή το browser.

function openSuccess(_data) {
	var thumb_url="";
    var rank = this.rank;
$("#" + rank).html("");
    var results = _data.results.bindings;
    if (results.length > 0) {
        for (var i in results) {
            var src = results[i].taxon.value;
            var name = nameFromUrl(src);

				if (results[i].thumb==undefined){
				thumb_url="assets/no_img_thumb.jpg"}
				else{
				thumb_url = results[i].thumb.value;
				}
            var html = thumbHtml(name, thumb_url,rank);


           $("#" + rank).append(html);
 sessionStorage.setItem('treePage',$('#tree_container').html());

        }
    } else {

        $("#" + rank).append("</br>No results!");
    }


}

Για το σκοπό αυτό προστέθηκε στο τέλος του index.html ο παρακάτω έλεγχος που φορτώνει το δέντρο από το sessionStorage αν υπάρχει.

   <script src="js/tree.js"></script>
	
	<script>
if (sessionStorage.getItem('treePage')!=undefined){
console.log('tree page');
$('#tree_container').html(sessionStorage.getItem('treePage'));
}

$(document).ajaxError(function(){
    alert("An error occurred!");
});
</script>

Στη σελίδα about.html υπάρχει ένας έλεγχος που ελέγχει αν ο χρήστης έχει διαλέξει κάποιο κόμβο και με τη βοήθεια του plugin wikiblurb λαμβάνει το άρθρο της wikipedia και το προσθέτει στη σελίδα.

<script type="text/javascript">
  if (sessionStorage.getItem('title')!=undefined){
 $('#article').wikiblurb({
        section: 0,
        page: sessionStorage.getItem('title'),
    });
 }else
 {$('#article').html("No article selected!")}
</script>

Η δημιουργία του διάγραμματος στα δεξιά της σελίδας γίνεται με το chart.js . Τα δεδομένα για το διάγραμμα δημιουργούνται στο αρχείο statistics.js

  var randomColorGenerator = function() {
      return '#' + (Math.random().toString(16) + '0000000').slice(2, 8);
  };

  function shadeColor2(color, percent) {
      var f = parseInt(color.slice(1), 16),
          t = percent < 0 ? 0 : 255,
          p = percent < 0 ? percent * -1 : percent,
          R = f >> 16,
          G = f >> 8 & 0x00FF,
          B = f & 0x0000FF;
      return "#" + (0x1000000 + (Math.round((t - R) * p) + R) * 0x10000 + (Math.round((t - G) * p) + G) * 0x100 + (Math.round((t - B) * p) + B)).toString(16).slice(1);
  }

  function totalQuerySuccess(_data) {
      console.log(_data);
      var totalCount = 0;
      var data = [];
      var dbpedia_results = _data.results.bindings;
      for (var j in dbpedia_results) {
          var name = nameFromUrl(dbpedia_results[j].order.value);
          var count = dbpedia_results[j].count.value;
          totalCount = totalCount + parseInt(count);
          name = name.replace("_", ' ');
          if (name == sessionStorage.getItem('title')) var currRanking = parseInt(j) + 1;
          data.push({
              value: count,
              color: randomColorGenerator(),
              highlight: randomColorGenerator(),
              label: '#' + j + ':' + name
          });
      }
      var total = parseInt(j) + 1;
      $('#totalNumber').html('Number of ' + sessionStorage.getItem('rank') + ' in ' + getPrevRank(sessionStorage.getItem('rank')) + ' ' + sessionStorage.getItem('prevRankName') + 'is:' + total +
          ' with a total of ' + totalCount + ' members');
      $('#current').html('#' + currRanking + ":" + sessionStorage.getItem('title'));
      var ctx = $("#myChart").get(0).getContext("2d");
      // This will get the first returned node in the jQuery collection.
      var myPieChart = new Chart(ctx).Pie(data);
  }
  var prevRankName = sessionStorage.getItem('prevRankName');
  var rank = sessionStorage.getItem('rank');
  var prevRank = getPrevRank(rank);
  query = getTotalQuery(prevRank, prevRankName, rank);
  console.log("stats" + query);
  var dbUrl = "http://dbpedia.org/sparql"
  var queryUrl = encodeURI(dbUrl + "?query=" + query + "&format=json");
  $.ajax({
      dataType: "jsonp",
      url: queryUrl,
      success: totalQuerySuccess
  });

Επίσης υλοποιήθηκαν δύο λειτουργίες αναζήτησης. Η πρώτη είναι η αναζήτηση που γίνεται στη σελίδα article.html και εμφανίζει το άρθρο της wikipedia για το ον που αναζητάει ο χρήστης, αν αυτό υπάρχει.

function searchArticle() {
    var queryUrl = articleExistsQuery($('#searchBox').val())
    $.ajax({
        dataType: "jsonp",
        url: queryUrl,
        success: searchSuccess
    });
}

function saveTree() {
    var currPage = getCurrPage();
    if (currPage == 'index.html') sessionStorage.setItem('treePage', $('#tree_container').html());
}

function searchSuccess(_data) {
    var results = _data.query.pages;
    for (var i in results) {}
    if (i > 0) {
        $('#article').wikiblurb({
            section: 0,
            page: $('#searchBox').val()
        });
    } else {
        $('#article').html("Wikipedia article doesn't exist")
    }
}

Και το δεύτερο είδος αναζήτησης είναι αυτό που μπορεί να κάνει ο χρήστης στη σελίδα index.html. Σε αυτό το είδος αναζήτησης, το δέντρο διαμόρφώνεται ανάλογα με τον όρο αναζήτησης. Εκτελείται η συνάρτηση executeQuery, που χρησιμοποιείται όταν ο χρήστης ανοίγει ένα κόμβο, και εκτελείται τόσες φορές μέχρι να γεμίσει το δέντρο ως τη τάξη του όρου αναζήτησης.

function makeSearchTreeSuccess(_data){
	$("#kingdom").nextAll().html(""); 
	var kingdom ='';
	var phylum ='';
	var classis ='';
	var order = '';
	var family = '';
	var genus = '';
	var type = '';
	var results = _data.results.bindings;
	 for (var i in results) {
		 
			if (results[i].kingdom!=undefined){
				var kingdom = nameFromUrl(results[i].kingdom.value);
				kingdom=kingdom.replace(/ /g,"_");
			}
			if (results[i].phylum!=undefined){
				var phylum = nameFromUrl(results[i].phylum.value);
				phylum=phylum.replace(/ /g,"_");
			}
			if (results[i].classis!=undefined){
				var classis = nameFromUrl(results[i].classis.value);
				classis=classis.replace(/ /g,"_");
			}
			if (results[i].order!=undefined){
				var order = nameFromUrl(results[i].order.value);
				order=order.replace(/ /g,"_");
			}
			if (results[i].family!=undefined){
				var family = nameFromUrl(results[i].family.value);
				family=family.replace(/ /g,"_");
			}
			if (results[i].genus!=undefined){
				var genus = nameFromUrl(results[i].genus.value);
				genus=genus.replace(/ /g,"_");
			}
		console.log("phylum is "+phylum)
	if (kingdom=='Animal'||kingdom=='Animalia')	
		kingdom_type="Animal";
	if (kingdom=='Plant'||kingdom=='Plantae')
		kingdom_type="Plant";
	 }
//Find phylums	 
	query = getOpenQuery(kingdom_type, 'kingdom', 'phylum');
	console.log(query);
    executeQuery(query, 'phylum', type);
//Find classes
	query = getOpenQuery(phylum, 'phylum', 'class');
	console.log(query);
    executeQuery(query, 'class', phylum);
//Find orders
	query = getOpenQuery(classis, 'class', 'order');
	console.log(query);
    executeQuery(query, 'order', classis);
//Find families
	query = getOpenQuery(order, 'order', 'family');
	console.log(query);
    executeQuery(query, 'family', order);
//Find genii
	query = getOpenQuery(family, 'family', 'genus');
	console.log(query);
    executeQuery(query, 'genus', family);
}