From e543492939413e09a8a872f7345a6006376b6619 Mon Sep 17 00:00:00 2001
From: weru <onewesh@gmail.com>
Date: Tue, 24 Mar 2020 19:30:52 +0000
Subject: [PATCH] add helpers

---
 assets/js/index.js |  113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 113 insertions(+), 0 deletions(-)

diff --git a/assets/js/index.js b/assets/js/index.js
index 9c8d8b5..e133e42 100644
--- a/assets/js/index.js
+++ b/assets/js/index.js
@@ -137,6 +137,9 @@
 
 function loadActions() {
 
+  const parentURL = '{{ absURL "" }}';
+  const doc = document.documentElement;
+
   (function updateDate() {
     const date = new Date();
     const year = date.getFullYear();
@@ -245,6 +248,116 @@
     }
     
   })();
+
+  (function makeExternalLinks(){
+    let links = elems('a');
+    if(links) {
+      Array.from(links).forEach(function(link){
+        let target, rel, blank, noopener, attr1, attr2, url, isExternal;
+        url = elemAttribute(link, 'href');
+        isExternal = (url && typeof url == 'string' && url.startsWith('http')) && !url.startsWith(parentURL) ? true : false;
+        if(isExternal) {
+          target = 'target';
+          rel = 'rel';
+          blank = '_blank';
+          noopener = 'noopener';
+          attr1 = elemAttribute(link, target);
+          attr2 = elemAttribute(link, noopener);
+
+          attr1 ? false : elemAttribute(link, target, blank);
+          attr2 ? false : elemAttribute(link, rel, noopener);
+        }
+      });
+    }
+  })();
+
+  let headingNodes = [], results, link, icon, current, id,
+  tags = ['h2', 'h3', 'h4', 'h5', 'h6'];
+
+  current = document.URL;
+
+  tags.forEach(function(tag){
+    results = document.getElementsByTagName(tag);
+    Array.prototype.push.apply(headingNodes, results);
+  });
+  
+  function sanitizeURL(url) {
+    // removes any existing id on url
+    const hash = '#';
+    const positionOfHash = url.indexOf(hash);
+    if(positionOfHash > -1 ) {
+      const id = url.substr(positionOfHash, url.length - 1);
+      url = url.replace(id, '');
+    }
+    return url
+  }
+
+  headingNodes.forEach(function(node){
+    link = createEl('a');
+    icon = createEl('img');
+    icon.src = '{{ absURL "icons/link.svg" }}';
+    link.className = 'link icon';
+    link.appendChild(icon);
+    id = node.getAttribute('id');
+    if(id) {
+      link.href = `${sanitizeURL(current)}#${id}`;
+      node.appendChild(link);
+      pushClass(node, 'link_owner');
+    }
+  });
+
+  const copyToClipboard = str => {
+    let copy, selection, selected;
+    copy = createEl('textarea');
+    copy.value = str;
+    copy.setAttribute('readonly', '');
+    copy.style.position = 'absolute';
+    copy.style.left = '-9999px';
+    selection = document.getSelection();
+    doc.appendChild(copy);
+    // check if there is any selected content
+    selected = selection.rangeCount > 0 ? selection.getRangeAt(0) : false;
+    copy.select();
+    document.execCommand('copy');
+    doc.removeChild(copy);
+    if (selected) { // if a selection existed before copying
+      selection.removeAllRanges(); // unselect existing selection
+      selection.addRange(selected); // restore the original selection
+    }
+  }
+
+
+  function copyFeedback(parent) {
+    const copyText = document.createElement('div');
+    const yanked = 'link_yanked';
+    copyText.classList.add(yanked);
+    copyText.innerText = 'Link Copied';
+    if(!elem(`.${yanked}`, parent)) {
+      parent.appendChild(copyText);
+      setTimeout(function() { 
+        // parent.removeChild(copyText)
+      }, 3000);
+    }
+  }
+
+  (function copyHeadingLink() {
+    let deeplink, deeplinks, newLink, parent, target;
+    deeplink = 'link';
+    deeplinks = elems(`.${deeplink}`);
+    if(deeplinks) {
+      document.addEventListener('click', function(event)
+      {
+        target = event.target;
+        parent = target.parentNode;
+        if (target && containsClass(target, deeplink) || containsClass(parent, deeplink)) {
+          event.preventDefault();
+          newLink = target.href != undefined ? target.href : target.parentNode.href;
+          copyToClipboard(newLink);
+          target.href != undefined ?  copyFeedback(target) : copyFeedback(target.parentNode);
+        }
+      });
+    }
+  })();
 }
 
 window.addEventListener('load', loadActions());

--
Gitblit v1.10.0