{"id":54725,"date":"2022-01-26T03:01:00","date_gmt":"2022-01-25T17:01:00","guid":{"rendered":"http:\/\/www.rjmprogramming.com.au\/ITblog\/?p=54725"},"modified":"2022-01-26T08:03:45","modified_gmt":"2022-01-25T22:03:45","slug":"personalized-links-external-javascript-hotlinking-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/personalized-links-external-javascript-hotlinking-tutorial\/","title":{"rendered":"Personalized Links External Javascript Hotlinking Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/personal_links_external_javascript_hotlinking.gif\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Personalized Links External Javascript Hotlinking Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/personal_links_external_javascript_hotlinking.gif\" title=\"Personalized Links External Javascript Hotlinking Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Personalized Links External Javascript Hotlinking Tutorial<\/p><\/div>\n<p>Another layer of functionality onto the external Javascript arrangements of yesterday&#8217;s <a title='WordPress Blog Personalized Links Tutorial' href='#wpbplt'>WordPress Blog Personalized Links Tutorial<\/a> is to reimagine the arrangements of the user of that &#8220;Personalized Links&#8221; (pretty much standalone <font size=1>(but more independently standalone today)<\/font>) external Javascript, that being this WordPress Blog, but to decouple some of the external Javascript logic away from WordPress Blog dependence, and onto <font color=blue>&#8220;www openness&#8221; (or external Javascript hotlinking)<\/font> and <font color=purple>emoji placement flexibility<\/font> &#8230;<\/p>\n<p><code><br \/>\n&lt;script type='text\/javascript' src='<font color=blue>\/\/www.rjmprogramming.com.au<\/font>\/personal_links.js<font color=purple>?wordingis=[innerHTMLmatchEmojisAppendToVia]<\/font>'&gt;&lt;\/script&gt;<br \/>\n<\/code><\/p>\n<p>This new &#8220;wordingis&#8221; argument can also exist at the web browser address bar level too.  All this being practical, the only other dependency <font size=1>(other than an unlucky clash of Javascript variable names used)<\/font> is the existence of &#8220;window.localStorage&#8221; with enough of that storage available for the user to add their &#8230;<\/p>\n<p><code><br \/>\n[URL]#[Hardcoding]<br \/>\n<\/code><\/p>\n<p> &#8230; couplings processed by <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/personal_links.js-GETME\">the changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/personal_links.js-GETME\">personal_links.js<\/a> external Javascript.  We hope you can find a way to use this clientside logic.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/personalized-links-external-javascript-hotlinking-tutorial\/'>Personalized Links External Javascript Hotlinking Tutorial<\/a>.<\/p-->\n<hr>\n<p id='wpbplt'>Previous relevant <a target=_blank title='WordPress Blog Personalized Links Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/wordpress-blog-personalized-links-tutorial\/'>WordPress Blog Personalized Links Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/personalized_links.jpg\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"WordPress Blog Personalized Links Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/personalized_links.jpg\" title=\"WordPress Blog Personalized Links Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">WordPress Blog Personalized Links Tutorial<\/p><\/div>\n<p>Writing these blog postings there are potential links we&#8217;re bound to forget to place into the blog postings.  This is fairly subjective, because one person&#8217;s link interest might trigger another person&#8217;s &#8220;ho hum&#8221; alert <font size=1>(and we all know the wooooorrrrrlllldddd needs more lerts)<\/font>.  Today, we want to offer the user the opportunity to create their own &#8230;<\/p>\n<p><code><br \/>\npersonalized links<br \/>\n<\/code><\/p>\n<p> &#8230; saved to &#8230;<\/p>\n<p><code><br \/>\nwindow.<a target=_blank title='window.localStorage information from W3schools' href='https:\/\/www.w3schools.com\/jsref\/prop_win_localstorage.asp'>localStorage<\/a><br \/>\n<\/code><\/p>\n<p> &#8230; and, thereby, being intersessional by nature.<\/p>\n<p>The user picks &#8220;hardcodings&#8221; (probably best to include surrounding space characters) in amongst the webpage wording that can turn into a &#8220;personalized link&#8221; via a single <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/personal_links.js_GETME\">personal_links.js<\/a> external Javascript (only needing change to our TwentyTen theme&#8217;s header.php &#8230;<\/p>\n<p><code><br \/>\n&lt;script type='text\/javascript' src='\/personal_links.js?rand=&lt;?php echo rand(0,1986754); ?&gt;'&gt;&lt;\/script&gt;<br \/>\n<\/code><\/p>\n<p>) &#8230; containing &#8230;<\/p>\n<p><code><br \/>\n\/\/ personal_links.js<br \/>\n\/\/ RJM Programming<br \/>\n\/\/ January, 2022<br \/>\n<br \/>\n   var retvwpp='';<br \/>\n   var retplinks=[];<br \/>\n   var pltextstr='';<br \/>\n   if (window.localStorage) {<br \/>\n     var wp_ls=location.search.split('wpplgro=')[1] ? decodeURIComponent(location.search.split('wpplgro=')[1]).split('&')[0] : ''<br \/>\n     if (wp_ls != '') {<br \/>\n       localStorage.removeItem('wp_personal_links');<br \/>\n       retvwpp='';<br \/>\n     } else if (getwpplgro() != '') {<br \/>\n       var retvis=(retvwpp);<br \/>\n       if (retvis != '') {<br \/>\n         pltextstr='';<br \/>\n         retplinks=retvis.split('`');<br \/>\n         for (var irg=0; irg&lt;retplinks.length; irg++) {<br \/>\n           if (retplinks[irg].indexOf('#') != -1) {<br \/>\n             if (pltextstr == '') { pltextstr='`';  }<br \/>\n             pltextstr+=(retplinks[irg].split('#')[1]) + '`';<br \/>\n           }<br \/>\n         }<br \/>\n         setTimeout(andsogolooking, 5000);<br \/>\n       }<br \/>\n     }<br \/>\n<br \/> <br \/>\n     if (document.URL.toLowerCase().indexOf('rjmprogramming.com.au\/itblog') != -1) {<br \/>\n      setTimeout(preaskwpplgro, 7000);<br \/>\n     }<br \/>\n<br \/> <br \/>\n   }<br \/>\n<br \/> <br \/>\n   function reverse(s) { \/\/ thanks to https:\/\/stackoverflow.com\/questions\/958908\/how-do-you-reverse-a-string-in-place-in-javascript<br \/>\n     return s.split(\"\").reverse().join(\"\");<br \/>\n   }<br \/>\n<br \/> <br \/>\n   function preaskwpplgro() {<br \/>\n       var xasare=document.getElementsByTagName('a');<br \/>\n       for (var ixasare=0; ixasare&lt;xasare.length; ixasare++) {<br \/>\n         \/\/console.log('0:' + xasare[ixasare].innerHTML + ' ... ' + ('' + xasare[ixasare].href));<br \/>\n         if (xasare[ixasare].innerHTML.replace('Long hover help available.','Highlighting and long hover help.') == 'Highlighting and long hover help.' && ('' + xasare[ixasare].href).indexOf('#') != -1) {<br \/>\n           \/\/console.log('1:' + xasare[ixasare].innerHTML + ' ... ' + ('' + xasare[ixasare].href));<br \/>\n           xasare[ixasare].onmousedown=function() { askwpplgro(); }<br \/>\n           xasare[ixasare].ontouchdown=function() { askwpplgro(); }<br \/>\n           xasare[ixasare].innerHTML=xasare[ixasare].innerHTML.replace('.','&amp;#128279;');<br \/>\n           xasare[ixasare].title+='  Also come here for personalized blog link management functionality.  ';<br \/>\n         }<br \/>\n       }<br \/>\n   }<br \/>\n<br \/> <br \/>\n   function askwpplgro() {<br \/>\n     var prepeu='', midpeu='';<br \/>\n     if (document.URL.toLowerCase().indexOf('rjmprogramming.com.au\/itblog')) {<br \/>\n       prepeu='If contextual help is available for a feature (that you long hover over) of this webpage a new green bordered webpage part will open and on clicking in this and answering Y you can read and interact with a relevant Blog Posting regarding this.  To remove (or restore) context help access the All Posts menu Toggle Context Help Mode submenu, as required. ' + String.fromCharCode(10) + '  ';<br \/>\n       midpeu=' (or enter ? for just personalized link information)';<br \/>\n     }<br \/>\n     var peu='?';<br \/>\n     while (peu == '?') {<br \/>\n       peu=prompt(prepeu + 'Please enter URL (no hashtags)' + midpeu + ' followed by hashtag (#) then case sensitive wording to associate the URL with (when not already linked) greater than one character long (spaces encouraged).  Special URL of . gets its URL from the first matching link found on the webpage.  Enter X to clear your URLs.', '');<br \/>\n       prepeu=retvwpp + String.fromCharCode(10) + String.fromCharCode(10);<br \/>\n       midpeu='';<br \/>\n     }<br \/>\n     if (peu == null) { peu=''; }<br \/>\n     if (peu.indexOf('#') &gt; 0) {<br \/>\n       if (peu.split('#')[1].trim() != '') {<br \/>\n       if (peu.split('#')[0] == '.') {<br \/>\n       var restp=peu.split('#')[1];<br \/>\n       var asare=document.getElementsByTagName('a');<br \/>\n       for (var iasare=0; iasare&lt;asare.length; iasare++) {<br \/>\n         if (asare[iasare].innerHTML == peu.split('#')[1] && peu.split('#')[0] == '.') {<br \/>\n           if (('' + asare[iasare].href).replace(\/^null$\/g,'') != '') {<br \/>\n             if (asare[iasare].href.split('#')[0].indexOf('?') == -1) {<br \/>\n             peu=asare[iasare].href.split('#')[0] + '?#' + restp;<br \/>\n             } else {<br \/>\n             peu=asare[iasare].href.split('#')[0] + '&#' + restp;<br \/>\n             }<br \/>\n           }<br \/>\n         }<br \/>\n       }<br \/>\n       }<br \/>\n       if (eval('' + peu.split('#')[1].length) &gt; 1) {<br \/>\n       if (peu.indexOf('?') &gt; 0) {<br \/>\n       setwpplgro(peu.split('?')[0] + '?' + encodeURIComponent(peu.split('?')[1]).replace(\/\\%26\/g,'&').replace(\/\\%23\/g,'#'));<br \/>\n       } else {<br \/>\n       setwpplgro(peu.split('#')[0] + '#' + encodeURIComponent(peu.split('#')[1]));<br \/>\n       }<br \/>\n       }<br \/>\n       }<br \/>\n       retvwpp='';<br \/>\n     } else if (peu.toLowerCase() == 'x') {<br \/>\n       localStorage.removeItem('wp_personal_links');<br \/>\n     }<br \/>\n   }<br \/>\n<br \/> <br \/>\n   function setwpplgro(invlu) {<br \/>\n    if (retvwpp == '') {<br \/>\n      localStorage.setItem('wp_personal_links', (invlu));<br \/>\n      andsogolooking();<br \/>\n    } else {<br \/>\n      localStorage.removeItem('wp_personal_links');<br \/>\n      localStorage.setItem('wp_personal_links', (retvwpp) + ('`') + (invlu));<br \/>\n      andsogolooking();<br \/>\n    }<br \/>\n    retvwpp=getwpplgro();<br \/>\n   }<br \/>\n<br \/> <br \/>\n   function getwpplgro() {<br \/>\n    retvwpp=('' + localStorage.getItem('wp_personal_links')).replace(\/^null$\/g,'');<br \/>\n    if (retvwpp != '') {<br \/>\n       var retvis=(localStorage.getItem('wp_personal_links')).replace(\/^null$\/g,'');<br \/>\n       if (retvis != '') {<br \/>\n         pltextstr='';<br \/>\n         \/\/alert('retvis=' + retvis);<br \/>\n         retplinks=retvis.split('`');<br \/>\n         for (var irg=0; irg&lt;retplinks.length; irg++) {<br \/>\n           if (retplinks[irg].indexOf('#') != -1) {<br \/>\n             if (pltextstr == '') { pltextstr='`';  }<br \/>\n             pltextstr+=(retplinks[irg].split('#')[1]) + '`';<br \/>\n           }<br \/>\n         }<br \/>\n         setTimeout(andsogolooking, 5000);<br \/>\n       }<br \/>\n    }<br \/>\n    return retvwpp;<br \/>\n   }<br \/>\n<br \/> <br \/>\n   function andsogolooking() {<br \/>\n     var ttsf=[], thiswptext='', rawhwptext='', ideareps=[], jjn, kkn, allokaywpl=false, newbih='', doit=false, addone=1;<br \/>\n     if (pltextstr != '') {<br \/>\n       ttsf=pltextstr.substring(0,eval(-1 + eval('' + pltextstr.length))).substring(1).split('`');<br \/>\n       \/\/alert('two:' + ttsf.length + ' and pltextstr=' + pltextstr + ' and ttsf[0]=' + ttsf[0]);<br \/>\n     }<br \/>\n     if (ttsf.length != 0) {<br \/>\n       thiswptext=(document.body.innerText || document.body.contentWindow || document.body.contentDocument);<br \/>\n       rawhwptext=document.body.innerHTML;<br \/>\n       newbih=rawhwptext;<br \/>\n       \/\/alert('ttsf.length=' + ttsf.length + ':' + ttsf[0] + ' and retplinks.length=' + retplinks.length + ':' + retplinks[0]);<br \/>\n     }<br \/>\n     for (jjn=0; jjn&lt;ttsf.length; jjn++) {<br \/>\n      addone=1;<br \/>\n      if (ttsf[jjn].trim() != '') {<br \/>\n       if (thiswptext.indexOf(decodeURIComponent(ttsf[jjn])) != -1) {<br \/>\n         if (newbih.indexOf(decodeURIComponent(ttsf[jjn])) != -1 && ((retplinks[jjn].split('#')[0].replace(\/\\?$\/g,'').replace(\/\\&$\/g,'') != retplinks[jjn].split('#')[0] || newbih.indexOf('&gt;' + decodeURIComponent(ttsf[jjn]) + '&lt;') == -1)) && newbih.indexOf('\"' + decodeURIComponent(ttsf[jjn]) + '\"') == -1) {<br \/>\n           ideareps=newbih.split(decodeURIComponent(ttsf[jjn]));<br \/>\n           allokaywpl=true;<br \/>\n           for (kkn=0; kkn&lt;ideareps.length; kkn++) {<br \/>\n             if (eval(1 + kkn) &gt;= eval('' + ideareps.length)) { addone=0; }<br \/>\n             \/\/if (ttsf[jjn] == 'en') { alert('reverse(ideareps[kkn]=' + reverse(ideareps[kkn]));    }<br \/>\n             if (eval('' + reverse(ideareps[kkn]).indexOf('\"')) &gt; eval('' + reverse(ideareps[kkn]).replace('&gt;','&lt;').indexOf('&lt;'))) {<br \/>\n              if (ideareps[kkn].slice(-1) != '&gt;' || ideareps[eval(addone + kkn)].substring(0,1) != '&lt;') {<br \/>\n               if (retplinks[jjn].split('#')[0].replace(\/\\?$\/g,'').replace(\/\\&$\/g,'') != retplinks[jjn].split('#')[0]) {<br \/>\n               newbih=newbih.replace(ideareps[kkn] + decodeURIComponent(ttsf[jjn]), ideareps[kkn] + '&lt;a target=_blank title=\"Taking you to ' + retplinks[jjn].split('#')[0].replace(\/\\?$\/g,'').replace(\/\\&$\/g,'') + ' as requested\" style=\"color:red;text-decoration-style:dotted;\" href=\"' + retplinks[jjn].split('#')[0].replace(\/\\?$\/g,'').replace(\/\\&$\/g,'') + '\"&gt;' + decodeURIComponent(ttsf[jjn]) + '&lt;\/a&gt;');<br \/>\n               } else {<br \/>\n               newbih=newbih.replace(ideareps[kkn] + decodeURIComponent(ttsf[jjn]), ideareps[kkn] + '&lt;a target=_blank title=\"Taking you to ' + retplinks[jjn].split('#')[0].replace(\/\\?$\/g,'').replace(\/\\&$\/g,'') + ' as requested\" style=\"color:orange;text-decoration-style:dotted;\" href=\"' + retplinks[jjn].split('#')[0].replace(\/\\?$\/g,'').replace(\/\\&$\/g,'') + '\"&gt;' + decodeURIComponent(ttsf[jjn]) + '&lt;\/a&gt;');<br \/>\n               }<br \/>\n               doit=true;<br \/>\n              }<br \/>\n             }<br \/>\n           }<br \/>\n         }<br \/>\n       }<br \/>\n      }<br \/>\n     }<br \/>\n     if (doit) { document.body.innerHTML=newbih; }<br \/>\n   }<br \/>\n<\/code><\/p>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d54720' onclick='var dv=document.getElementById(\"d54720\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/link\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d54720' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d54725' onclick='var dv=document.getElementById(\"d54725\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/hotlink\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d54725' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Another layer of functionality onto the external Javascript arrangements of yesterday&#8217;s WordPress Blog Personalized Links Tutorial is to reimagine the arrangements of the user of that &#8220;Personalized Links&#8221; (pretty much standalone (but more independently standalone today)) external Javascript, that being &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/personalized-links-external-javascript-hotlinking-tutorial\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,14,37],"tags":[151,409,3362,2761,3847,2828,652,1807,2415,919,2306,932,972,997,1319,3551,1456],"class_list":["post-54725","post","type-post","status-publish","format-standard","hentry","category-elearning","category-event-driven-programming","category-tutorials","tag-blog","tag-external-javascript","tag-hardcoding","tag-header-php","tag-hotlink","tag-hyperlink","tag-javascript","tag-link","tag-localstorage","tag-personalization","tag-personalize","tag-php","tag-posting","tag-programming","tag-tutorial","tag-window-localstorage","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/54725"}],"collection":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/comments?post=54725"}],"version-history":[{"count":8,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/54725\/revisions"}],"predecessor-version":[{"id":54733,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/54725\/revisions\/54733"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=54725"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=54725"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=54725"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}