aboutsummaryrefslogblamecommitdiff
path: root/hovercard.js
blob: d71de4ad582bb17789964ced0bde7814c03307c4 (plain) (tree)
1
2
3
4
5
6
7
8
9
10


                                                                          
                         


                                                                           
             

  
                                

                                                                          

                                                  
                                    





                                                                                     



                                                                                
       


                                                                                               


                                                                                        
                                   





                                                                                                                                            
       














                                                                                            




















                                                                       




                                                                                                             
           
                
                                                                                  


                                                                             










                                                              
       

     
// class name to use hovercards on can be passes as "data-class" parameter
var cl = document.currentScript.getAttribute("data-class") || "content";

var curURL = document.URL

// these will not attempt to get fetched, so can be used to override things
var hovercards = {
  curURL : {}
};

  function hover (target_link) {
    var hovercard_data = hovercards[target_link.href.replace(/\/+$/, "")];
    if (hovercard_data) {
      var new_box = document.createElement("div");
      new_box.classList.add("hovercard");
      if (hovercard_data["pname"]) {
        console.log(hovercard_data);
        var nick = ""
        if (hovercard_data["nickname"]) {
          nick = " (" + hovercard_data["nickname"] + ")"
        }
        new_box.innerHTML = "<strong>" + hovercard_data["pname"] + nick + "</strong>"
      } else {
        if (hovercard_data["title"]) {
          new_box.innerHTML = "<strong>" + hovercard_data["title"] + "</strong>"
        }
      }
      if (hovercard_data["description"]) {
        new_box.innerHTML = new_box.innerHTML + "<p>" + hovercard_data["description"] + "</p>";
      }
      if (hovercard_data["note"]) {
        new_box.innerHTML = new_box.innerHTML + "<p>" + hovercard_data["note"] + "</p>";
      }
      // if image available, add it
      if (hovercard_data["uphoto"]) {
        new_box.innerHTML = "<img src='" + hovercard_data["uphoto"] + "' alt='" + hovercard_data["pname"] + "' /><br>" + new_box.innerHTML;
      } else {
        if (hovercard_data["image"]) {
          new_box.innerHTML = "<img src='" + hovercard_data["image"] + "' alt='" + hovercard_data["title"] + "' /><br>" + new_box.innerHTML;
        }
      }
      new_box.style.top = window.scrollY + target_link.getBoundingClientRect().top + "px";
      new_box.style.left = window.scrollX + target_link.getBoundingClientRect().left + "px";
      new_box.id = "tooltip";
      document.body.appendChild(new_box);
    }
  }

  function unhover (target_link) {
    var active_hovercard = document.getElementById("tooltip");

    if (active_hovercard) {
      active_hovercard.parentNode.removeChild(active_hovercard);
    }
  }

  var article = document.getElementsByClassName(cl);
  for (let a of article) {
  
    var links = a.getElementsByTagName("a");
    for (var i = 0; i < links.length; i++) {
      links[i].addEventListener("mouseover", function() {
        hover(this);
      });
      links[i].addEventListener("mouseout", function() {
        unhover(this);
      });
      // these handlers are so that the hovercard will appear/disappear
      // with keyboard actions
      links[i].addEventListener("onfocus", function() {
        hover(this);
      });
      links[i].addEventListener("onfocusout", function() {
        unhover(this);
      });
      let url = links[i].href.replace(/\/+$/, "");
      if (!hovercards[url]) {
        if (links[i].hostname == window.location.hostname && links[i].pathname == window.location.pathname) {
          if (links[i].hash) {
            // this is an achor somewhere on the same page, give a peek in case it's a footnote
            let desc = document.getElementById(links[i].hash.replace("#", "")).innerText
            hovercards[url] = {"description": desc}
          }
        } else {
          let req = 'https://indieweb-glue.evgenykuznetsov.org/api/pageinfo?url=';
          if (Boolean(links[i].closest('.h-card'))) {
            req = 'https://indieweb-glue.evgenykuznetsov.org/api/hcard?url=';
          };
          req += url;
          const r = encodeURI(req);
          var xmlhttp = new XMLHttpRequest();
          xmlhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
              hovercards[url] = JSON.parse(this.responseText);
            }
          };
          xmlhttp.open("GET", r, true);
          xmlhttp.send();
        }
      }
    }
  }