Advertisement
Guest User

hol-hashtags V2

a guest
Apr 19th, 2023
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /// holhashtags.js
  2. (function() {
  3.   const HHT_POPUP_DELAY = 750;
  4.   let traad = [];
  5.   let link_timer = null;
  6.   let link_tag = null;
  7.   let scrollet = false;
  8.   const hht_find_svar = (id) => {
  9.     for (let i in traad) if (traad[i].id === id) return traad[i];
  10.     return null;
  11.   };
  12.   const hht_find_ref = (svar, ref, put) => {
  13.     for (let ri in svar.ref) if (svar.ref[ri] === ref) return ri;
  14.     if (put) return svar.ref.push(ref) - 1;
  15.     return -1;
  16.   };
  17.   const hht_skjul_pop_links = (tving) => {
  18.     let pl = document.getElementById('hht_pop_links');
  19.     if (tving || (event.target == pl)) {
  20.       pl.children[0].blur();
  21.       pl.children[1].blur();
  22.       pl.style.display = 'none';
  23.     }
  24.   };
  25.   const hht_stop_timer = () => { if (link_timer) { clearTimeout(link_timer); link_timer = null; } };
  26.   const hht_link_timeout = () => {
  27.     link_timer = null;
  28.     let rb = document.body.getBoundingClientRect();
  29.     let re = link_tag.getBoundingClientRect();
  30.     let pl = document.getElementById('hht_pop_links');
  31.     pl.style.top = '-100px';
  32.     pl.style.display = 'inline-block';
  33.     pl.style.fontSize = getComputedStyle(link_tag).getPropertyValue('font-size');
  34.     let pa = pl.children[1];
  35.     pa.href = link_tag.href;
  36.     pa.innerText = link_tag.innerText;
  37.     let pls = getComputedStyle(pl);
  38.     pl.style.left = (re.left - rb.left - pa.offsetLeft - parseFloat(pls.getPropertyValue('border-left-width'))) + 'px';
  39.     pl.style.top = (re.top - rb.top - pa.offsetTop - parseFloat(pls.getPropertyValue('border-top-width'))) + 'px';
  40.   };
  41.   const hht_vis_indlaeg = () => {
  42.     hht_skjul_pop_links(true);
  43.     let sid = parseInt(link_tag.innerText.substring(1, link_tag.innerText.length));
  44.     let svar = {rang:'',navn:'',dato:'',tekst:null};
  45.     if (sid == 0)
  46.     {
  47.       let e = document.getElementById('ContentPlaceHolder_ContentPlaceHolder_traadhead');
  48.       if (e) e = e.getElementsByClassName('date');
  49.       if (e) {
  50.         e = e[0];
  51.         svar.rang = e.childNodes[0].nodeValue;
  52.         if (svar.rang.startsWith('Af ')) svar.rang = svar.rang.substring(3, svar.rang.length);
  53.         svar.navn = e.childNodes[1].outerHTML;
  54.         svar.dato = e.childNodes[2].nodeValue.split('|')[1].trim();
  55.         svar.tekst = document.getElementById('ContentPlaceHolder_ContentPlaceHolder_traaddesc').innerHTML;
  56.       }
  57.     } else {
  58.       let e = document.getElementById('ContentPlaceHolder_ContentPlaceHolder_svar');
  59.       if (e) for (let si in e.children) {
  60.         let sv = e.children[si];
  61.         let ln = sv.getElementsByTagName('a');
  62.         if (ln && (parseInt(ln[0].name) == sid)) {
  63.           for (let lni in ln) if (ln[lni].href && (ln[lni].href.indexOf('/show_user.') > 0)) {
  64.             svar.navn = ln[lni].outerHTML;
  65.             break;
  66.           }
  67.           if (svar.navn.length == 0) {
  68.             e = sv.getElementsByClassName('bolditalic');
  69.             if (e && (e.length > 0)) svar.navn = e[0].outerHTML;
  70.           }
  71.           e = sv.getElementsByClassName('bruger');
  72.           if (e && (e.length > 0)) svar.rang = e[0].innerText;
  73.           e = sv.getElementsByClassName('artikel_read_time');
  74.           if (e && (e.length > 0)) svar.dato = e[0].innerText;
  75.           e = sv.getElementsByClassName('t47-svar-content');
  76.           if (e && (e.length > 0)) svar.tekst = e[0].innerHTML;
  77.           break;
  78.         }
  79.       }
  80.     }
  81.     if (svar.tekst && (svar.navn.length > 0)) {
  82.       let indlaeg = document.getElementById('hht_indlaeg');
  83.       indlaeg.style.opacity = '0';
  84.       indlaeg.style.display = 'inline-block';
  85.       let navn = 'Af ';
  86.       if (svar.rang.length > 0) navn += svar.rang + ' ';
  87.       indlaeg.children[0].children[0].innerHTML = navn + svar.navn;
  88.       indlaeg.children[0].children[1].innerText = svar.dato;
  89.       let tekst = indlaeg.children[1];
  90.       tekst.innerHTML = svar.tekst;
  91.       if (tekst.lastChild && (tekst.lastChild.className === 'hht_refs')) tekst.removeChild(tekst.lastChild);
  92.       tekst.scrollTo(0,0);
  93.       let rb = document.body.getBoundingClientRect();
  94.       r = link_tag.getBoundingClientRect();
  95.       let offs = link_tag.parentElement.className === 'hht_refs' ? -r.height : indlaeg.offsetHeight;
  96.       indlaeg.style.top = (r.top - rb.top - offs) + 'px';
  97.       indlaeg.style.animationName = 'anim_vis';
  98.     }
  99.   };
  100.   const hht_link_events = (lnk) => {
  101.     if (HHT_POPUP_DELAY > 0) {
  102.       lnk.addEventListener('mouseover', ()=>{ hht_stop_timer(); link_tag = event.currentTarget; link_timer = setTimeout(hht_link_timeout, HHT_POPUP_DELAY); });
  103.       lnk.addEventListener('mouseout', hht_stop_timer);
  104.     }
  105.     return lnk;
  106.   };
  107.   const hht_tjek_svar = (svar) => {
  108.     let tc = 0;
  109.     let ti = 0;
  110.     while ((tc < 10) && (ti < svar.text.childNodes.length)) {
  111.       let te = svar.text.childNodes[ti];
  112.       if (te.nodeType === 3) {
  113.         let tp = te.nodeValue.indexOf('#');
  114.         while (tp >= 0) {
  115.           let tpe = tp + 1;
  116.           while ((tpe < te.nodeValue.length) && ('0123456789'.indexOf(te.nodeValue.charAt(tpe)) >= 0)) tpe++;
  117.           let val = parseInt(te.nodeValue.substring(tp+1, tpe));
  118.           let ref = hht_find_svar(val);
  119.           if (ref) {
  120.             hht_find_ref(ref, svar.id, true);
  121.             let foer = document.createTextNode(te.nodeValue.substring(0, tp));
  122.             let link = hht_link_events(document.createElement('a'));
  123.             link.href = '#' + (val === 0 ? 'traadstart' : val);
  124.             link.innerText = '#' + val;
  125.             link.className = 'hht_lnk';
  126.             let efter = document.createTextNode(te.nodeValue.substring(tpe, te.nodeValue.length));
  127.             svar.text.insertBefore(foer, te);
  128.             svar.text.insertBefore(link, te);
  129.             svar.text.replaceChild(efter, te);
  130.             te = efter;
  131.             tp = te.nodeValue.indexOf('#');
  132.             tc++;
  133.           } else tp = te.nodeValue.indexOf('#', tp + 1);
  134.         }
  135.       }
  136.       ti++;
  137.     }
  138.   };
  139.   const hht_lav_ref = (svar) => {
  140.     if (svar.ref.length > 0) {
  141.       let div = document.createElement('div');
  142.       div.className = 'hht_refs';
  143.       let hdr = document.createElement('span');
  144.       hdr.className = 'hht_hdr';
  145.       hdr.innerText = 'Refereret: ';
  146.       div.appendChild(hdr);
  147.       for (let rfi in svar.ref) {
  148.         let ref = hht_link_events(document.createElement('a'));
  149.         ref.className = 'hht_ref';
  150.         ref.innerText = '#' + svar.ref[rfi];
  151.         ref.href = ref.innerText;
  152.         div.appendChild(ref);
  153.       }
  154.       svar.text.appendChild(div);
  155.     }
  156.   };
  157.   const hht_indsaet_html = () => {
  158.     let e = document.createElement('style');
  159.     e.setAttribute('type', 'text/css');
  160.     e.innerText = 'div.hht_refs { font-size:smaller; margin-top:.5em; padding-top:.5em; border-top:1px solid #eeeeee; }\n' +
  161.                   'span.hht_hdr { color:gray; font-weight:bold; }\n' +
  162.                   'a.hht_lnk {  }\n' +
  163.                   'a.hht_ref { margin-right:.25em; }\n' +
  164.                   '#hht_pop_links { position:absolute; margin:0px; background-color:#eeeeee; display:none; border:1px solid #2b5076; padding:0px 5px 0px 5px; border-radius:5px; }\n' +
  165.                   '#hht_indlaeg { border:1px solid #cccccc; border-radius:5px; display:none; position:absolute; background-color:white; z-index:10000; animation-duration:.25s; }\n' +
  166.                   '#hht_indlaeg_top { background-color:#dddddd; padding:5px; border-radius:5px 5px 0px 0px; }\n' +
  167.                   '#hht_indlaeg_top_v { }\n' +
  168.                   '#hht_indlaeg_top_h { float:right; }\n' +
  169.                   '#hht_indlaeg_bund { clear:both; left:0px; max-height:25vh; overflow-y:scroll; padding:5px; border-radius:0px 0px 5px 5px; margin:0px; background-color:#f0f0f0; white-space:pre-wrap; }\n' +
  170.                   '@keyframes anim_vis { from:{ opacity:0 } to { opacity:1 } }\n@keyframes anim_gem { from:{ opacity:1 } to { opacity:0 } }';
  171.     document.head.appendChild(e);
  172.     e = document.createElement('div');
  173.     e.id = 'hht_pop_links';
  174.     let a = document.createElement('a');
  175.     a.href = 'javascript:void(0)';
  176.     a.innerText = 'Vis';
  177.     a.style.marginRight = '.3em';
  178.     a.addEventListener('click', hht_vis_indlaeg);
  179.     e.appendChild(a);
  180.     a = document.createElement('a');
  181.     a.addEventListener('click', ()=>{ hht_skjul_pop_links(true); });
  182.     e.appendChild(a);
  183.     e.addEventListener('mouseleave', hht_skjul_pop_links);
  184.     document.body.appendChild(e);
  185.     e = document.createElement('div');
  186.     e.id = 'hht_indlaeg';
  187.     e.addEventListener('animationend', () => {
  188.       if (e.style.animationName === 'anim_gem') e.style.display = 'none';
  189.       else e.style.opacity = '1';
  190.       e.style.animationName = '';
  191.     });
  192.     let rb = document.body.getBoundingClientRect();
  193.     let rd = document.getElementById('ContentPlaceHolder_ContentPlaceHolder_traaddesc').getBoundingClientRect();
  194.     e.style.width = (rd.width - 10) + 'px';
  195.     e.style.left = (rd.left - rb.left + 5) + 'px';
  196.     let ee = document.createElement('div');
  197.     ee.id = 'hht_indlaeg_top';
  198.     e.appendChild(ee);
  199.     ee = document.createElement('span');
  200.     ee.id = 'hht_indlaeg_top_v';
  201.     e.children[0].appendChild(ee);
  202.     ee = document.createElement('span');
  203.     ee.id = 'hht_indlaeg_top_h';
  204.     e.children[0].appendChild(ee);
  205.     ee = document.createElement('div');
  206.     ee.id = 'hht_indlaeg_bund';
  207.     e.appendChild(ee);
  208.     document.body.appendChild(e);
  209.     document.body.addEventListener('mouseup', () => {
  210.       let e = event.target;
  211.       while (e && (e.tagName.toLowerCase() != 'a')) {
  212.         if (e.id === 'hht_indlaeg') return;
  213.         e = e.parentElement;
  214.       }
  215.       document.getElementById('hht_indlaeg').style.animationName = 'anim_gem';
  216.     });
  217.   };
  218.   const hht_indlaes = () => {
  219.     let desc = document.getElementById('ContentPlaceHolder_ContentPlaceHolder_traaddesc');
  220.     let svar = document.getElementById('ContentPlaceHolder_ContentPlaceHolder_svar');
  221.     if (desc && svar) {
  222.       hht_indsaet_html();
  223.       traad.push({text:desc,id:0,ref:[]});
  224.       for (let svi in svar.children) {
  225.         let sve = svar.children[svi];
  226.         let svo = {text:null,id:0,ref:[]};
  227.         for (let chi in sve.children) {
  228.           let che = sve.children[chi];
  229.           if (che.className === 't47-svar-top') {
  230.             let a = che.getElementsByTagName('a');
  231.             if (a.length > 0) {
  232.               let sid = parseInt(a[0].name);
  233.               if ((!isNaN(sid)) && (sid > 0)) svo.id = sid;
  234.             }
  235.           } else if (che.className === 't47-svar-content') svo.text = che;
  236.         }
  237.         if (svo.text && (svo.id > 0)) traad.push(svo);
  238.       }
  239.       for (let svi = 1; svi < traad.length; svi++) hht_tjek_svar(traad[svi]);
  240.       for (let svi in traad) hht_lav_ref(traad[svi]);
  241.     }
  242.   };
  243.   if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', hht_indlaes);
  244.   else hht_indlaes();
  245. })();
  246.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement