{"id":72501,"date":"2026-04-03T03:01:00","date_gmt":"2026-04-02T17:01:00","guid":{"rendered":"https:\/\/www.rjmprogramming.com.au\/ITblog\/?p=72501"},"modified":"2026-04-02T12:31:45","modified_gmt":"2026-04-02T02:31:45","slug":"live-captions-interfacing-to-text-to-speech-interfacing-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/live-captions-interfacing-to-text-to-speech-interfacing-tutorial\/","title":{"rendered":"Live Captions Interfacing to Text to Speech Interfacing Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/macos_say_record.php\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"Live Captions Interfacing to Text to Speech Interfacing Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record_live_captions.gif\" title=\"Live Captions Interfacing to Text to Speech Interfacing Tutorial\"   \/><\/a><p class=\"wp-caption-text\">Live Captions Interfacing to Text to Speech Interfacing Tutorial<\/p><\/div>\n<p>Changed within the thread of blog postings of the recent <a title='Google Chart Geo Chart Integration Speech Bubbles Popup Div Hashtag Tutorial' href='#gcgcisbpdht'>Google Chart Geo Chart Integration Speech Bubbles Popup Div Hashtag Tutorial<\/a> was our PHP interfacer web application to &#8230;<\/p>\n<p><code><br \/>\n<a target=\"_blank\" title='say command information from Apple' href='https:\/\/ss64.com\/osx\/say.html' rel=\"noopener\">say<\/a><br \/>\n<\/code><\/p>\n<p> &#8230; macOS command line tool for Text to Speech functionality.<\/p>\n<p>Well, yesterday&#8217;s Live Captions work with <a target=\"_blank\" rel=\"noopener\" href='https:\/\/www.rjmprogramming.com.au\/ITblog\/web-browser-live-captions-primer-tutorial\/' title='Web Browser Live Captions Primer Tutorial'>Web Browser Live Captions Primer Tutorial<\/a> got us to wondering whether Live Captions can be called into play with any of this &#8220;Intranet feeling&#8221; (ie. say only works on macOS) work.<\/p>\n<p>Our research has us, so far, only working it for &#8230;<\/p>\n<ul>\n<li>non-mobile<\/li>\n<li><a target=\"_blank\" title='MAMP' href='http:\/\/www.mamp.info' rel=\"noopener\">MAMP<\/a> (ie. local web server)<\/li>\n<li>macOS<\/li>\n<li>Google Chrome<\/li>\n<li>Google Chrome settings allowing<\/li>\n<li>Accessibility system settings allowing<\/li>\n<li>macOS version allowing<\/li>\n<li>macOS device Chip type allowing<\/li>\n<li>macOS Language and Region &#8230; English (US) or English (Canada) &#8230; allowing<\/li>\n<\/ul>\n<p> &#8230; means.  Ouch?! <span><a class=\"audioytplay\" target=\"_blank\" title=\"?\" href='https:\/\/www.youtube.com\/watch?v=LAjfB0XfjkA' rel=\"noopener\">Today&#8217;s consolation prize, anyone?<\/a><\/span>  Or perhaps <span><a class=\"audioNOytplay\" target=\"_blank\" title=\"?\" rel=\"noopener\" href='https:\/\/www.youtube.com\/watch?v=QPyC2S3xp34'>this one?<\/a><\/span>  But, nevertheless, we proceed, and yes, Live Captions can get involved with this scenario, and <a target=\"_blank\" title='Google Translate' href='http:\/\/translate.google.com' rel=\"noopener\">Google Translate<\/a> can get involved too, which makes it all kind of interesting.  Please don&#8217;t expect perfection getting the same <font color=blue>Text<\/font>-&gt;Speech coming out of the Speech-&gt;<font color=purple>Text<\/font> but, as this functionality is coming from a big player, it could well speed up and become more precise over time, but for the meantime we offered a new <button style=background-color:yellow;>Live Captions<\/button button when conditions suit where a click ...<\/p>\n<ul>\n<li>does not loop the audio &#8220;say&#8221; based audio<\/li>\n<li>plays it at half speed (which we saw <font color=blue>gave a better chance<\/font> for the Live Captions to keep up) &#8230;<br \/>\n<code><br \/>\n <font color=blue>function livecaptionit(ta) {<br \/>\n  if (ta.innerHTML.indexOf('data:audio\/') != -1) {<br \/>\n   if (1 == 1) {<br \/>\n    voiceoverit();<br \/>\n    setTimeout(function(){<br \/>\n      var auds=document.getElementsByTagName('audio');<br \/>\n      if (eval('' + auds.length) &gt; 0) {<br \/>\n        auds[eval(-1 + auds.length)].playbackRate = 0.5;<br \/>\n        auds[eval(-1 + auds.length)].loop=false;<br \/>\n        auds[eval(-1 + auds.length)].play();<br \/>\n      }<br \/>\n    }, 5000);<br \/>\n    setTimeout(function(){<br \/>\n      var xauds=document.getElementsByTagName('audio');<br \/>\n      if (eval('' + xauds.length) &gt; 0) {<br \/>\n        xauds[eval(-1 + xauds.length)].playbackRate = 1.0;<br \/>\n        xauds[eval(-1 + xauds.length)].loop=true;<br \/>\n      }<br \/>\n    }, 35000);<br \/>\n   } else {<br \/>\n    document.getElementById('myaudio').style.display='inline-block';<br \/>\n    document.getElementById('myaudiosrc').type='audio\/' + ta.innerHTML.split('data:audio\/')[1].split(',')[0].split(';')[0];<br \/>\n    if (document.getElementById('audioname').value != '') {<br \/>\n    document.getElementById('myaudiosrc').src='\/' + document.getElementById('audioname').value;<br \/>\n    } else {<br \/>\n    document.getElementById('myaudiosrc').src=ta.innerHTML;<br \/>\n    }<br \/>\n    document.getElementById('myaudio').play();<br \/>\n   }<br \/>\n  }<br \/>\n }<br \/>\n <br \/>\n function waitforavideo() {<br \/>\n   if (document.getElementById('avideo')) {<br \/>\n     if (eval('' + document.getElementById('avideo').innerHTML.split('&lt;\/spa').length) &gt; 2) {<br \/>\n        document.getElementById('result').title='Double click for Live Captions play';<br \/>\n        document.getElementById('butresult').style.display='inline-block';<br \/>\n        return '';<br \/>\n     }<br \/>\n   }<br \/>\n   setTimeout(waitforavideo, 1000);<br \/>\n }<\/font><br \/>\n  <br \/>\n function checkres() {<br \/>\n   if (document.getElementById('result')) {<br \/>\n    if (document.getElementById('result').innerHTML.indexOf('data:') == 0) {<br \/>\n      document.getElementById('saysub').style.cursor='pointer';<br \/>\n      if (!qresfound) {<br \/>\n       if (qresdu != document.getElementById('result').innerHTML) {<br \/>\n        if (eval('' + document.getElementById('audioname').value.length) &gt; 6) {<br \/>\n         <font color=blue>var isChrome = \/Chrome\/.test(navigator.userAgent) && \/Google Inc\/.test(navigator.vendor);<br \/>\n         if (isChrome) {<br \/>\n            setTimeout(waitforavideo, 1000);<br \/>\n         }<\/font><br \/>\n         qresdu=document.getElementById('result').innerHTML;<br \/>\n         residues.push(qresdu);<br \/>\n         tempidues.push('\/tmp\/' + document.getElementById('audioname').value.substring(0,eval(-6 + eval('' + document.getElementById('audioname').value.length))) + document.getElementById('audioname').value.slice(-6).replace(\/\\.\/g, '_macoshelp_' + Math.floor(Math.random() * 10897654) + '.'));<br \/>\n        }<br \/>\n        qresfound=false;<br \/>\n       }<br \/>\n      }<br \/>\n    }<br \/>\n   }<br \/>\n }<br \/>\n<\/code>\n<\/li>\n<\/ul>\n<p> &#8230; regarding <a target=\"_blank\" title=\"macos_say_record.php\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/macos_say_record.php---------------------------------------GETME' rel=\"noopener\">the changed<\/a> downloadable PHP localhost URL <font color=black>ht<\/font>tp:\/\/localhost:8888\/<a target=\"_blank\" title=\"macos_say_record.php\" href='http:\/\/www.rjmprogramming.com.au\/macos_say_record.php---------------------------------------GETME' rel=\"noopener\">macos_say_record.php<\/a> you should plonk into the MAMP document root folder.<\/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\/live-captions-interfacing-to-text-to-speech-interfacing-tutorial\/' rel=\"noopener\">Live Captions Interfacing to Text to Speech Interfacing Tutorial<\/a>.<\/p-->\n<hr>\n<p id='gcgcisbpdht'>Previous relevant <a target=\"_blank\" title='Google Chart Geo Chart Integration Speech Bubbles Popup Div Hashtag Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/google-chart-geo-chart-integration-speech-bubbles-popup-div-hashtag-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Popup Div Hashtag Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart.php\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"Google Chart Geo Chart Integration Speech Bubbles Popup Div Hashtag Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/hash_popup.png\" title=\"Google Chart Geo Chart Integration Speech Bubbles Popup Div Hashtag Tutorial\"   \/><\/a><p class=\"wp-caption-text\">Google Chart Geo Chart Integration Speech Bubbles Popup Div Hashtag Tutorial<\/p><\/div>\n<p>Back to the main workflow of <a title='Google Chart Geo Chart Integration Speech Bubbles Textarea Relative Media Tutorial' href='#gcgcisbtrmt'>Google Chart Geo Chart Integration Speech Bubbles Textarea Relative Media Tutorial<\/a> the day before yesterday&#8217;s <a title='Window Opener and Parent Conduit Tutorial' href='#wopct'>Window Opener and Parent Conduit Tutorial<\/a> it becomes apparent working those relative URLs in amongst absolute URLs or data URI references within your Speech Bubble content, today we simulate &#8230;<\/p>\n<ul>\n<li>what we&#8217;ve done in the past overlaying the textarea element with a div one &#8230; but there is too little room in this project&#8217;s scenarios, so &#8230;<\/li>\n<li>we open a new popup with just the div linking content as above via a textarea onclick event modus operandi<\/li>\n<\/ul>\n<p> &#8230; the content &#8220;mediarized&#8221; as user controlled, via a hashtag system that expands media within that popup div element via more  <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/journal.php\" rel=\"noopener\">Journal<\/a> project thinking &#8230;<\/p>\n<blockquote><p>\n &#8230; where hashtags #qrcode and #play and #display and #listen and #embed and #show and #background are hashtag media effect options &#8230;\n<\/p><\/blockquote>\n<p> &#8230; using &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/cowsay.php------------------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/cowsay.php------------------GETME\" rel=\"noopener\">latest draft<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\">Cartoon creation and email sharing capable<\/a> PHP web application<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/gchartgen.js----------------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/gchartgen.js----------------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">gchartgen.js<\/a> external Javascript helper<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/window_opener_pal.html-GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/window_opener_pal.html-GETME\" rel=\"noopener\">window_opener_pal.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/window_opener_pal.html?hcontent=content\" rel=\"noopener\">idea<\/a><\/li>\n<\/ul>\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\/google-chart-geo-chart-integration-speech-bubbles-popup-div-hashtag-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Popup Div Hashtag Tutorial<\/a>.<\/p-->\n<hr>\n<p id='wopct'>Previous relevant <a target=\"_blank\" title='Window Opener and Parent Conduit Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/window-opener-and-parent-conduit-tutorial\/' rel=\"noopener\">Window Opener and Parent Conduit Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/window_opener_pal.html?hcontent=content\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"Window Opener and Parent Conduit Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/window_opener_pal.gif\" title=\"Window Opener and Parent Conduit Tutorial\"   \/><\/a><p class=\"wp-caption-text\">Window Opener and Parent Conduit Tutorial<\/p><\/div>\n<p>After yesterday&#8217;s <a title='Google Chart Geo Chart Integration Speech Bubbles Textarea Relative Media Tutorial' href='#gcgcisbtrmt'>Google Chart Geo Chart Integration Speech Bubbles Textarea Relative Media Tutorial<\/a> we come to another &#8220;generic detour&#8221; we want to attend to.<\/p>\n<p>Yesterday&#8217;s relative URL, like &#8230;<\/p>\n<p><code><br \/>\n\/responsive_more.jpg<br \/>\n<\/code><\/p>\n<p> &#8230; set us to thinking how such a relative URL cannot work in the scenario &#8230;<\/p>\n<p><code><br \/>\n var woo=window.open('','_blank','top=0,left=0,width=600,height=800');<br \/>\n woo.document.write([content]);<br \/>\n<\/code><\/p>\n<p> &#8230; but if we wrote some HTML to pass on content from the originator &#8230;<\/p>\n<p><code><br \/>\n var woo=window.open('\/\/www.rjmprogramming.com.au\/window_opener_pal.html?hcontent=[content]','_blank','top=0,left=0,width=600,height=800');<br \/>\n<\/code><\/p>\n<p> &#8230; should <i>[content]<\/i> contain one of those such relative URLs we think that could be a different story.   So <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/window_opener_pal.html_GETME\" rel=\"noopener\">window_opener_pal.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/window_opener_pal.html?hcontent=content\" rel=\"noopener\">idea<\/a> &#8230;<\/p>\n<p><code><br \/>\n&lt;html&gt;<br \/>\n&lt;head&gt;<br \/>\n&lt;title&gt;Help RJM Programming Window Open Callers - RJM Programming - March, 2026&lt;\/title&gt;<br \/>\n&lt;script type=text\/javascript&gt;<br \/>\n<br \/>\n  var hcontent=(location.search + ('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'')).split('hcontent=')[1] ? decodeURIComponent((location.search + ('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'')).split('hcontent=')[1].split('&')[0]) : '';<br \/>\n  var functocall=(location.search + ('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'')).split('functocall=')[1] ? decodeURIComponent((location.search + ('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'')).split('functocall=')[1].split('&')[0]) : '';<br \/>\n  var vartoref=(location.search + ('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'')).split('vartoref=')[1] ? decodeURIComponent((location.search + ('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'')).split('vartoref=')[1].split('&')[0]) : '';<br \/>\n  var elid=(location.search + ('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'')).split('elid=')[1] ? decodeURIComponent((location.search + ('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'')).split('elid=')[1].split('&')[0]) : '';<br \/>\n<br \/>\n  function checkwop() {<br \/>\n    if (window.opener) {<br \/>\n      if (hcontent != '') {<br \/>\n        document.body.innerHTML=hcontent;<br \/>\n      } else if (functocall != '') {<br \/>\n        console.warn('hcontent=(\"\" + window.opener.' + functocall + '()).replace(\/^undefined\/g,\"\").replace(\/^null\/g,\"\")');<br \/>\n        eval('hcontent=(\"\" + window.opener.' + functocall + '()).replace(\/^undefined\/g,\"\").replace(\/^null\/g,\"\")');<br \/>\n        if (hcontent == '' && elid != '') {<br \/>\n          eval('document.body.innerHTML=(\"\" + window.opener.document.getElementById(\"' + elid + '\").outerHTML.replace(\/none\\;\/g,\"block;\").replace(\"parent.getCursor\",\"window.opener.getCursor\")).replace(\/^undefined\/g,\"\").replace(\/^null\/g,\"\")');<br \/>\n        }<br \/>\n      } else if (vartoref != '') {<br \/>\n        eval('hcontent=(\"\" + window.opener.' + vartoref + ').replace(\/^undefined\/g,\"\").replace(\/^null\/g,\"\")');<br \/>\n        if (hcontent == '' && elid != '') {<br \/>\n          eval('document.body.innerHTML=(\"\" + window.opener.document.getElementById(\"' + elid + '\").outerHTML.replace(\/none\\;\/g,\"block;\").replace(\"parent.getCursor\",\"window.opener.getCursor\")).replace(\/^undefined\/g,\"\").replace(\/^null\/g,\"\")');<br \/>\n        }<br \/>\n      } else if (elid != '') {<br \/>\n        eval('document.body.innerHTML=(\"\" + window.opener.document.getElementById(\"' + elid + '\").outerHTML.replace(\/none\\;\/g,\"block;\").replace(\"parent.getCursor\",\"window.opener.getCursor\")).replace(\/^undefined\/g,\"\").replace(\/^null\/g,\"\")');<br \/>\n      }<br \/>\n    } else if (window.parent != window.self) {<br \/>\n      if (hcontent != '') {<br \/>\n        document.body.innerHTML=hcontent;<br \/>\n      } else if (functocall != '') {<br \/>\n        eval('hcontent=(\"\" + window.parent.' + functocall + '()).replace(\/^undefined\/g,\"\").replace(\/^null\/g,\"\")');<br \/>\n        if (hcontent == '' && elid != '') {<br \/>\n          eval('document.body.innerHTML=(\"\" + window.parent.document.getElementById(\"' + elid + '\").outerHTML.replace(\/none\\;\/g,\"block;\").replace(\"parent.getCursor\",\"window.opener.getCursor\")).replace(\/^undefined\/g,\"\").replace(\/^null\/g,\"\")');<br \/>\n        }<br \/>\n      } else if (vartoref != '') {<br \/>\n        eval('hcontent=(\"\" + window.parent.' + vartoref + ').replace(\/^undefined\/g,\"\").replace(\/^null\/g,\"\")');<br \/>\n        if (hcontent == '' && elid != '') {<br \/>\n          eval('document.body.innerHTML=(\"\" + window.parent.document.getElementById(\"' + elid + '\").outerHTML.replace(\/none\\;\/g,\"block;\").replace(\"parent.getCursor\",\"window.opener.getCursor\")).replace(\/^undefined\/g,\"\").replace(\/^null\/g,\"\")');<br \/>\n        }<br \/>\n      } else if (elid != '') {<br \/>\n        eval('document.body.innerHTML=(\"\" + window.parent.document.getElementById(\"' + elid + '\").outerHTML.replace(\/none\\;\/g,\"block;\").replace(\"parent.getCursor\",\"window.opener.getCursor\")).replace(\/^undefined\/g,\"\").replace(\/^null\/g,\"\")');<br \/>\n      }<br \/>\n    } else if (hcontent != '') {<br \/>\n      document.body.innerHTML=hcontent;<br \/>\n    }<br \/>\n  }<br \/>\n<br \/>\n&lt;\/script&gt;<br \/>\n&lt;\/head&gt;<br \/>\n&lt;body onload=checkwop(); id=xxbody&gt;<br \/>\n&lt;\/body&gt;<br \/>\n&lt;\/html&gt;<br \/>\n<\/code><\/p>\n<p> &#8230; is like our new see-through &#8220;conduit&#8221; friend.<\/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\/window-opener-and-parent-conduit-tutorial\/' rel=\"noopener\">Window Opener and Parent Conduit Tutorial<\/a>.<\/p-->\n<hr>\n<p id='gcgcisbtrmt'>Previous relevant <a target=\"_blank\" title='Google Chart Geo Chart Integration Speech Bubbles Textarea Relative Media Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/google-chart-geo-chart-integration-speech-bubbles-textarea-relative-media-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Textarea Relative Media Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart.php\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"Google Chart Geo Chart Integration Speech Bubbles Textarea Relative Media Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/gchartgen_relative_media.gif\" title=\"Google Chart Geo Chart Integration Speech Bubbles Textarea Relative Media Tutorial\"   \/><\/a><p class=\"wp-caption-text\">Google Chart Geo Chart Integration Speech Bubbles Textarea Relative Media Tutorial<\/p><\/div>\n<p>Back to the main workflow of <a title='Google Chart Geo Chart Integration Speech Bubbles Textarea Onblur Tutorial' href='#gcgcisbtot'>Google Chart Geo Chart Integration Speech Bubbles Textarea Onblur Tutorial<\/a> as the day before yesterday&#8217;s <a title='Google Chart Geo Chart AppleScript Functionality Integration Bug Tutorial' href='#gcgcasfibt'>Google Chart Geo Chart AppleScript Functionality Integration Bug Tutorial<\/a> we touch on two steps, moving forward &#8230;<\/p>\n<ol>\n<li>appended &#8230;<br \/>\n<blockquote><p>\n#say\n<\/p><\/blockquote>\n<p> &#8230; means by which &#8230;<\/p>\n<blockquote>\n<ul>\n<li>textarea ondblclick event controlled<\/li>\n<li>Intranet feeling<\/li>\n<li>window.open popup<\/li>\n<li>PHP localhost URL <font color=black>ht<\/font>tp:\/\/localhost:8888\/<a target=\"_blank\" title=\"macos_say_record.php\" href='http:\/\/www.rjmprogramming.com.au\/macos_say_record.php--------------------------------------GETME' rel=\"noopener\">macos_say_record.php<\/a><\/li>\n<li>using exec to point to<\/li>\n<li>underlying macOS and <a target=\"_blank\" title='MAMP for Apache\/PHP\/MySql on Mac OS X local web server' href='http:\/\/www.mamp.info' rel=\"noopener\">MAMP<\/a> local Apache\/PHP\/MySql web server environment command <a target=\"_blank\" title='say command information from Apple' href='https:\/\/ss64.com\/osx\/say.html' rel=\"noopener\"><i>say<\/i><\/a><\/li>\n<li>means to turn Text to Speech<\/li>\n<\/ul>\n<\/blockquote>\n<p>\n &#8230; users can be offered a continuous Text to Speech execution modus operandi &#8230;<\/li>\n<li>allow for image, video, audio media (just, so far) relative URL, such as &#8230;<br \/>\n<code><br \/>\n\/responsive_more.jpg<br \/>\n<\/code><br \/>\n &#8230; hence the &#8220;Relative Media&#8221; words in the blog posting title &#8230; that, if exist, add to the &#8220;hardcoding to textarea onclick to left savvy&#8221; link logic covering <font color=blue>now<\/font> &#8230;<\/p>\n<blockquote>\n<ul>\n<li><a title='YouTube' href='https:\/\/youtube.com'>YouTube<\/a> 11 character &#8230; link to a YouTube video &#8230;<\/li>\n<li>YouTube 34 character &#8230; link to a YouTube playlist &#8230;<\/li>\n<li><a target=\"_blank\" title='Spotify' href='https:\/\/www.spotify.com\/' rel=\"noopener\">Spotify<\/a> 22 character &#8230; link to a Spotify playlist &#8230;<\/li>\n<li>Strings with . and @ &#8230; link to a mailto: &#8220;a&#8221; link means of communication &#8230;<\/li>\n<li>Strings mainly numerical &#8230; link to an SMS: &#8220;a&#8221; link means of communication<\/li>\n<li>Strings starting with &#8220;http&#8221; or &#8220;\/\/&#8221; &#8230; link to a URL, suiting ones like <a target=\"_blank\" title='Wikipedia ... thanks' href='http:\/\/wikipedia.org' rel=\"noopener\">Wikipedia<\/a> uses (at this stage)<\/li>\n<li><font color=blue>Strings starting with a single &#8220;\/&#8221; &#8230; link to a media (so far) relative URL that exists on the RJM Programming domain web server<\/font><\/li>\n<\/ul>\n<\/blockquote>\n<\/li>\n<\/ol>\n<p> &#8230; <font color=blue>featuring in<\/font> (with thanks to <a target=\"_blank\" title='Useful link, thanks' href='https:\/\/www.google.com\/search?q=can+a+window.open+second+parameter+pointing+to+iframe+name+be+used+to+check+for+existence+of+a+relative+URL+file+on+a+web+server&#038;sca_esv=6b7c40959298e02e&#038;rlz=1C5OZZY_en&#038;sxsrf=ANbL-n5LheO67tq8kUgMIT0WDvjv3n25Rw%3A1774317391889&#038;ei=T-_Baf36Namkvr0P55LamQQ&#038;biw=1440&#038;bih=732&#038;ved=0ahUKEwi93vKut7eTAxUpkq8BHWeJNkMQ4dUDCBE&#038;uact=5&#038;oq=can+a+window.open+second+parameter+pointing+to+iframe+name+be+used+to+check+for+existence+of+a+relative+URL+file+on+a+web+server&#038;gs_lp=Egxnd3Mtd2l6LXNlcnAigAFjYW4gYSB3aW5kb3cub3BlbiBzZWNvbmQgcGFyYW1ldGVyIHBvaW50aW5nIHRvIGlmcmFtZSBuYW1lIGJlIHVzZWQgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBhIHJlbGF0aXZlIFVSTCBmaWxlIG9uIGEgd2ViIHNlcnZlckgAUABYAHAAeAGQAQCYAQCgAQCqAQC4AQPIAQD4AQGYAgCgAgCYAwCSBwCgBwCyBwC4BwDCBwDIBwCACAA&#038;sclient=gws-wiz-serp' rel=\"noopener\">this link<\/a>) &#8230;<\/p>\n<p><code><br \/>\n  var xtypes = ['image\/tif', 'audio\/x-m4r','audio\/wav','audio\/x-wav','audio\/x-pn-realaudio','audio\/x-mpegurl','audio\/x-aiff','audio\/mpeg','audio\/mid',<br \/>\n      'audio\/basic','audio\/ogg','video\/x-sgi-movie','video\/x-msvideo','video\/quicktime','audio\/mp3','video\/mp4','video\/mpeg',<br \/>\n      'video\/x-la-asf','video\/ogg','video\/webm','audio\/mp4', 'image\/jpeg', 'image\/jpeg', 'image\/png', 'image\/gif', 'image\/bmp',<br \/>\n      'text\/html', 'text\/html', 'text\/html', 'text\/javascript', 'text\/css', 'text\/plain', 'text\/xml', 'text\/csv',<br \/>\n      'application\/vnd.ms-word', 'application\/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application\/x-php', 'application\/pdf', 'IMAGE\/pdf',<br \/>\n      'application\/vnd.openxmlformats-officedocument.presentationml.presentation', 'application\/vnd.ms-powerpoint',<br \/>\n      'application\/vnd.ms-excel', 'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'video\/mp4'];<br \/>\n  var xexts = ['.tif','.m4r','.wav','.wav','.ram','.m3u','.aiff','.mp3','.rmi',<br \/>\n      '.snd','.ogg','.movie','.avi','.mov','.mp3','.m4v','.mpeg',<br \/>\n      '.lsx','.ogv','.webm','.m4a', '.jpg', '.jpeg', '.png', '.gif', '.bmp',<br \/>\n      '.htm', '.html', '.htmls', '.js', '.css', '.txt', '.xml', '.csv',<br \/>\n      '.doc', '.docx', '.php', '.pdf', '.pdf',<br \/>\n      '.pptx', '.ppt',<br \/>\n      '.xls', '.xlsx', '.mp4'];<br \/>\n<font color=blue>var reluadd='', relulist=[];<br \/>\nvar relunlist=[];<br \/>\nvar pwind=0, pwinda=[];<\/font><br \/>\n<br \/>\n<font color=blue>async function checkUrlExists(url) { \/\/ thanks to https:\/\/www.google.com\/search?q=can+a+window.open+second+parameter+pointing+to+iframe+name+be+used+to+check+for+existence+of+a+relative+URL+file+on+a+web+server&sca_esv=6b7c40959298e02e&rlz=1C5OZZY_en&sxsrf=ANbL-n5LheO67tq8kUgMIT0WDvjv3n25Rw%3A1774317391889&ei=T-_Baf36Namkvr0P55LamQQ&biw=1440&bih=732&ved=0ahUKEwi93vKut7eTAxUpkq8BHWeJNkMQ4dUDCBE&uact=5&oq=can+a+window.open+second+parameter+pointing+to+iframe+name+be+used+to+check+for+existence+of+a+relative+URL+file+on+a+web+server&gs_lp=Egxnd3Mtd2l6LXNlcnAigAFjYW4gYSB3aW5kb3cub3BlbiBzZWNvbmQgcGFyYW1ldGVyIHBvaW50aW5nIHRvIGlmcmFtZSBuYW1lIGJlIHVzZWQgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBhIHJlbGF0aXZlIFVSTCBmaWxlIG9uIGEgd2ViIHNlcnZlckgAUABYAHAAeAGQAQCYAQCgAQCqAQC4AQPIAQD4AQGYAgCgAgCYAwCSBwCgBwCyBwC4BwDCBwDIBwCACAA&sclient=gws-wiz-serp<br \/>\n    try {<br \/>\n        const response = await fetch(url, { method: 'HEAD' }); \/\/ Use HEAD to avoid downloading the file<br \/>\n        \/\/ response.ok is true for status codes 200-299<br \/>\n        if (reluadd != '') {  relulist.push(reluadd);  sofarothers.push(reluadd);  sofarurls.push(reluadd);  }<br \/>\n        reluadd='';<br \/>\n        pwind++;<br \/>\n        return response.ok;<br \/>\n    } catch (error) {<br \/>\n        \/\/ This catch block handles network errors, not necessarily 404s<br \/>\n        if (reluadd != '') {  relunlist.push(reluadd);  }<br \/>\n        reluadd='';<br \/>\n        pwind++;<br \/>\n        return false;<br \/>\n    }<br \/>\n}  <\/font><br \/>\n<br \/>\n  function inline_linking(aname) {<br \/>\n   <font color=blue>var delayis=1000;<br \/>\n   pwind=0;<br \/>\n   pwinda=[];<\/font><br \/>\n    \/\/ code here from previous work ...<br \/>\n    <font color=blue>if (relulist.indexOf(pword) == -1 && relunlist.indexOf(pword) == -1 && (pword + ' ').substring(0,1) == '\/' && (pword + ' ').indexOf('\/\/') == -1) {<br \/>\n      if (pword.indexOf('.') != -1) {<br \/>\n        if (xexts.indexOf('.' + pword.split('.')[eval(-1 + pword.split('.').length)].split('#')[0].toLowerCase()) != -1) {<br \/>\n          if (xtypes[xexts.indexOf('.' + pword.split('.')[eval(-1 + pword.split('.').length)].split('#')[0].toLowerCase())].indexOf('image\/') == 0) {<br \/>\n pwinda.push(pword);<br \/>\n setTimeout(function(){<br \/>\n \/\/ Example Usage (for a relative URL file on the same server)<br \/>\n reluadd=pwinda[pwind];<br \/>\n checkUrlExists(reluadd.split('#')[0]).then(exists => { \/\/<br \/>\n    console.log(exists ? \"File exists!\" : \"File does not exist.\");<br \/>\n });<br \/>\n }, delayis);<br \/>\n delayis+=3000;<br \/>\n          } else if (xtypes[xexts.indexOf('.' + pword.split('.')[eval(-1 + pword.split('.').length)].split('#')[0].toLowerCase())].indexOf('video\/') == 0) {<br \/>\n pwinda.push(pword);<br \/>\n setTimeout(function(){<br \/>\n \/\/ Example Usage (for a relative URL file on the same server)<br \/>\n reluadd=pwinda[pwind];<br \/>\n checkUrlExists(reluadd.split('#')[0]).then(exists => { \/\/<br \/>\n    console.log(exists ? \"File exists!\" : \"File does not exist.\");<br \/>\n });<br \/>\n }, delayis);<br \/>\n delayis+=3000;<br \/>\n          } else if (xtypes[xexts.indexOf('.' + pword.split('.')[eval(-1 + pword.split('.').length)].split('#')[0].toLowerCase())].indexOf('audio\/') == 0) {<br \/>\n pwinda.push(pword);<br \/>\n setTimeout(function(){<br \/>\n \/\/ Example Usage (for a relative URL file on the same server)<br \/>\n reluadd=pwinda[pwind];<br \/>\n checkUrlExists(reluadd.split('#')[0]).then(exists => { \/\/<br \/>\n    console.log(exists ? \"File exists!\" : \"File does not exist.\");<br \/>\n });<br \/>\n }, delayis);<br \/>\n delayis+=3000;<br \/>\n          }<br \/>\n        }<br \/>\n      }<br \/>\n    } else if (relulist.indexOf(pword) == -1 && relunlist.indexOf(pword) == -1 && (pword + ' ').substring(0,1) == '\/' && (pword + ' ').indexOf('\/\/') == 0) {<br \/>\n      relulist.push(pword);<br \/>\n    }<\/font><br \/>\n    \/\/ code here from previous work ...<br \/>\n  }<br \/>\n<\/code><\/p>\n<p> &#8230; incorporated in &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/cowsay.php-----------------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/cowsay.php-----------------GETME\" rel=\"noopener\">latest draft<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\">Cartoon creation and email sharing capable<\/a> PHP web application<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/gchartgen.js---------------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/gchartgen.js---------------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">gchartgen.js<\/a> external Javascript helper<\/li>\n<\/ul>\n<p> &#8230; you can <a href='#ifif'>try out for yourself below<\/a> if you like.<\/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\/google-chart-geo-chart-integration-speech-bubbles-textarea-relative-media-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Textarea Relative Media Tutorial<\/a>.<\/p-->\n<hr>\n<p id='gcgcasfibt'>Previous relevant <a target=\"_blank\" title='Google Chart Geo Chart AppleScript Functionality Integration Bug Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/google-chart-geo-chart-applescript-functionality-integration-bug-tutorial\/' rel=\"noopener\">Google Chart Geo Chart AppleScript Functionality Integration Bug Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart.php\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"Google Chart Geo Chart AppleScript Functionality Integration Bug Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/gchartgen_ap_bug.gif\" title=\"Google Chart Geo Chart AppleScript Functionality Integration Bug Tutorial\"   \/><\/a><p class=\"wp-caption-text\">Google Chart Geo Chart AppleScript Functionality Integration Bug Tutorial<\/p><\/div>\n<p>After yesterday&#8217;s <a title='Google Chart Geo Chart Integration Speech Bubbles Textarea Intranet Feeling Tutorial' href='#gcgcisbtift'>Google Chart Geo Chart Integration Speech Bubbles Textarea Intranet Feeling Tutorial<\/a> we come to a &#8220;generic detour&#8221; we need to attend to.<\/p>\n<table>\n<tr>\n<th>Symptom &#8230;<\/th>\n<\/tr>\n<tr>\n<td>The onhover smarts of the <a title=\"Google Chart Tools provide a perfect way to visualize data on your website. From simple line charts to complex hierarchical tree maps, the chart galley provides a large number of well-designed chart types. Populating your data is easy using the provided client- and server-side tools.\" href=\"https:\/\/developers.google.com\/chart\/interactive\/docs\/index\" target=\"_blank\" rel=\"noopener\">Google Chart<\/a> <a target=\"_blank\" title='Google Chart Geo Chart information from Google' href='https:\/\/developers.google.com\/chart\/interactive\/docs\/gallery\/geochart' rel=\"noopener\">Geo Chart<\/a> suffer when the AppleScript integrations are loaded<\/td>\n<\/tr>\n<tr>\n<th>Culprit &#8230;<\/th>\n<\/tr>\n<tr>\n<td>We tracked it down to <font color=blue>what we used to have<\/font> &#8230;<br \/>\n<code><br \/>\n<font color=blue>function ggmuchlater() { \/\/ thanks to https:\/\/dev-answers.com\/solutions\/3287e028\/how-do-i-include-a-javascript-file-in-another-javascript-file<br \/>\n  <\/font>if (!document.getElementById('apscr') && !document.getElementById('asue')) {<font color=blue><br \/>\n    var scriptz = document.createElement(\"script\");  \/\/ create a script DOM node<br \/>\n    scriptz.src = '\/apple_script_url.js?left=calc(100% - 60px)&top=2px&emojXi=128220&css=font-size:30px;opacity:0.8;&mustcontain=&';  \/\/ set its src to the provided URL<br \/>\n    document.head.appendChild(scriptz);  \/\/ add it to the end of the head section of the page (could change 'head' to 'body' to add it to the end of the body section instead)<br \/>\n  <\/font>}<font color=blue><br \/>\n}<\/font><br \/>\n<\/code><\/p>\n<p> &#8230; working with &#8230;<\/p>\n<p><code><br \/>\n&lt;script id=apXscr type=text\/javascript src=\"\/apple_script_url.js?left=calc(100% - 60px)&top=2px&emojXi=128220&css=font-size:30px;opacity:0.8;&mustcontain=&\"&gt;&lt;\/script&gt;<br \/>\n<\/code>\n<\/td>\n<\/tr>\n<tr>\n<th>Solution &#8230;<\/th>\n<\/tr>\n<tr>\n<td><code><br \/>\nfunction gggmuchlater(evt) { \/\/ thanks to https:\/\/dev-answers.com\/solutions\/3287e028\/how-do-i-include-a-javascript-file-in-another-javascript-file<br \/>\n    var scriptz = document.createElement(\"script\");  \/\/ create a script DOM node<br \/>\n    scriptz.src = '\/apple_script_url.js?left=calc(100% - 60px)&top=2px&emojXi=128220&css=font-size:30px;opacity:0.8;&mustcontain=&';  \/\/ set its src to the provided URL<br \/>\n    document.getElementById('bitsatend').appendChild(scriptz);  \/\/ add it to the end of the head section of the page (could change 'head' to 'body' to add it to the end of the body section instead)<br \/>\n    globevt=evt;<br \/>\n    setTimeout(function(){ justplayme(globevt);  setTimeout(function(){ if (('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'') != '') {  window.location.reload(true); } else { location.href=document.URL; } }, 15000); }, 5000);<br \/>\n}<br \/>\n<\/code><\/p>\n<p> &#8230; working with, just &#8230;<\/p>\n<p><code><br \/>\n&lt;a style=\"position:fixed;left:calc(100% - 60px);top:2px;cursor: pointer; text-decoration: none;font-size:30px; display: inline-block; background-color: green; border-bottom-right-radius: 85px; opacity: 1;\" onclick=\"gggmuchlater(event);\" title=\"Apple Script snapshot re-execution via macOS Desktop with double click emailing at left and top and double click SMS at bottom right corner only\" id=\"asue\"&gt;&amp;#x1F4DD;&lt;\/a&gt;<br \/>\n<\/code>\n<\/td>\n<\/tr>\n<\/table>\n<p> &#8230; and the <strike>avoidance of <\/strike>use of <i>document.head.appendChild(scriptz);<\/i> (at least with a delayed window reload) did the trick to make the Geo Chart onhover functionality start working again, more consistently with &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" title='geo_chart.php' href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart.php-----------------------------------------------------------------------------------------------------------GETME' rel=\"noopener\">changed<\/a> <a target=\"_blank\" title='geo_chart.php' href='http:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart.php-----------------------------------------------------------------------------------------------------------GETME' rel=\"noopener\">geo_chart.php<\/a> <a target=\"_blank\" title='geo_chart.php' href='http:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart.php' rel=\"noopener\">Geo Chart<\/a><\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/apple_script_url.js----GETME\" title=\"apple_script_url.js\" rel=\"noopener\">a changed &#8220;external Javascript&#8221;<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/apple_script_url.js----GETME\" title=\"apple_script_url.js\" rel=\"noopener\">apple_script_url.js<\/a><\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/gchartgen.js--------------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/gchartgen.js--------------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">gchartgen.js<\/a> external Javascript helper<\/li>\n<\/ul>\n<p> &#8230; you can <a href='#ifif'>try out for yourself below<\/a> if you like.<\/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\/google-chart-geo-chart-applescript-functionality-integration-bug-tutorial\/' rel=\"noopener\">Google Chart Geo Chart AppleScript Functionality Integration Bug Tutorial<\/a>.<\/p-->\n<hr>\n<p id='gcgcisbtift'>Previous relevant <a target=\"_blank\" title='Google Chart Geo Chart Integration Speech Bubbles Textarea Intranet Feeling Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/google-chart-geo-chart-integration-speech-bubbles-textarea-intranet-feeling-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Textarea Intranet Feeling Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart.php\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"Google Chart Geo Chart Integration Speech Bubbles Textarea Intranet Feeling Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/gchartgen_intranet_feeling.gif\" title=\"Google Chart Geo Chart Integration Speech Bubbles Textarea Intranet Feeling Tutorial\"   \/><\/a><p class=\"wp-caption-text\">Google Chart Geo Chart Integration Speech Bubbles Textarea Intranet Feeling Tutorial<\/p><\/div>\n<p>Further to yesterday&#8217;s <a title='Google Chart Geo Chart Integration Speech Bubbles Textarea Onblur Tutorial' href='#gcgcisbtot'>Google Chart Geo Chart Integration Speech Bubbles Textarea Onblur Tutorial<\/a> today&#8217;s extension to textarea smarts, potentially, involves &#8230;<\/p>\n<ul>\n<li>textarea ondblclick event controlled<\/li>\n<li>Intranet feeling<\/li>\n<li>window.open popup<\/li>\n<li>PHP localhost URL <font color=black>ht<\/font>tp:\/\/localhost:8888\/<a target=\"_blank\" title=\"macos_say_record.php\" href='http:\/\/www.rjmprogramming.com.au\/macos_say_record.php--------------------------------------GETME' rel=\"noopener\">macos_say_record.php<\/a><\/li>\n<li>using exec to point to<\/li>\n<li>underlying macOS and <a target=\"_blank\" title='MAMP for Apache\/PHP\/MySql on Mac OS X local web server' href='http:\/\/www.mamp.info' rel=\"noopener\">MAMP<\/a> local Apache\/PHP\/MySql web server environment command <a target=\"_blank\" title='say command information from Apple' href='https:\/\/ss64.com\/osx\/say.html' rel=\"noopener\"><i>say<\/i><\/a><\/li>\n<li>means to turn Text to Speech<\/li>\n<\/ul>\n<p> &#8230; allowing users to &#8220;cowsay say say&#8221; via <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/cowsay.php-----------------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/cowsay.php-----------------GETME\" rel=\"noopener\">latest draft<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\">Cartoon creation and email sharing capable<\/a> PHP web application teaming with <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/gchartgen.js-------------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/gchartgen.js-------------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">gchartgen.js<\/a> external Javascript helper <i>onkeydown<\/i> keyboard event Javascript code which <font size=1>non-mobile<\/font> you can <a href='#ifif'>try out for yourself below<\/a> if you like.<\/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\/google-chart-geo-chart-integration-speech-bubbles-textarea-intranet-feeling-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Textarea Intranet Feeling Tutorial<\/a>.<\/p-->\n<hr>\n<p id='gcgcisbtot'>Previous relevant <a target=\"_blank\" title='Google Chart Geo Chart Integration Speech Bubbles Textarea Onblur Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/google-chart-geo-chart-integration-speech-bubbles-textarea-onblur-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Textarea Onblur Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart.php\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"Google Chart Geo Chart Integration Speech Bubbles Textarea Onblur Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/gchartgen_yet_more.jpg\" title=\"Google Chart Geo Chart Integration Speech Bubbles Textarea Onblur Tutorial\"   \/><\/a><p class=\"wp-caption-text\">Google Chart Geo Chart Integration Speech Bubbles Textarea Onblur Tutorial<\/p><\/div>\n<p>Adding onto yesterday&#8217;s <a title='Google Chart Geo Chart Integration Speech Bubbles Textarea Onclick Tutorial' href='#xgcgcisbtot'>Google Chart Geo Chart Integration Speech Bubbles Textarea Onclick Tutorial<\/a> we&#8217;re creeping forward on functionality today, adding to &#8230;<\/p>\n<ol>\n<li>address bar URL hashtag<\/li>\n<li>blind typing &#8230; with, today &#8230;<\/li>\n<li>textarea typing via it&#8217;s onblur or onpaste events<\/li>\n<\/ol>\n<p> &#8230; allowing users to &#8220;cowsay say&#8221; via <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/cowsay.php----------------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/cowsay.php----------------GETME\" rel=\"noopener\">&#8220;third draft&#8221;<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\">Cartoon creation and email sharing capable<\/a> PHP web application teaming with <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/gchartgen.js------------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/gchartgen.js------------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">gchartgen.js<\/a> external Javascript helper <i>onkeydown<\/i> keyboard event Javascript code which <font size=1>non-mobile<\/font> you can <a href='#ifif'>try out for yourself below<\/a> if you like.<\/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\/google-chart-geo-chart-integration-speech-bubbles-textarea-onblur-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Textarea Onblur Tutorial<\/a>.<\/p-->\n<hr>\n<p id='xgcgcisbtot'>Previous relevant <a target=\"_blank\" title='Google Chart Geo Chart Integration Speech Bubbles Textarea Onclick Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/google-chart-geo-chart-integration-speech-bubbles-textarea-onclick-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Textarea Onclick Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart.php\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"Google Chart Geo Chart Integration Speech Bubbles Textarea Onclick Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/gchartgen_more.jpg\" title=\"Google Chart Geo Chart Integration Speech Bubbles Textarea Onclick Tutorial\"   \/><\/a><p class=\"wp-caption-text\">Google Chart Geo Chart Integration Speech Bubbles Textarea Onclick Tutorial<\/p><\/div>\n<p>Onto yesterday&#8217;s <a title='Google Chart Geo Chart Integration Speech Bubbles Modus Operandi Tutorial' href='#gcgcisbmot'>Google Chart Geo Chart Integration Speech Bubbles Modus Operandi Tutorial<\/a> within the Speech Bubble text we&#8217;ve added textarea onclick logic to detect clicks to the left of words which might describe such link interests such as <a target=\"_blank\" title='YouTube' href='https:\/\/youtube.com' rel=\"noopener\">YouTube<\/a> video ID 11 character code words.<\/p>\n<p>More detail on this to come via <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/gchartgen.js-----------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/gchartgen.js-----------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">gchartgen.js<\/a> external Javascript helper <i>onkeydown<\/i> keyboard event Javascript code which <font size=1>non-mobile<\/font> you can <a href='#ifif'>try out for yourself below<\/a> if you like.<\/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\/google-chart-geo-chart-integration-speech-bubbles-textarea-onclick-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Textarea Onclick Tutorial<\/a>.<\/p-->\n<hr>\n<p id='gcgcisbmot'>Previous relevant <a target=\"_blank\" title='Google Chart Geo Chart Integration Speech Bubbles Modus Operandi Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/google-chart-geo-chart-integration-speech-bubbles-modus-operandi-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Modus Operandi Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart.php\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"Google Chart Geo Chart Integration Speech Bubbles Modus Operandi Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart_speech_bubbles_modus_operandi.gif\" title=\"Google Chart Geo Chart Integration Speech Bubbles Modus Operandi Tutorial\"   \/><\/a><p class=\"wp-caption-text\">Google Chart Geo Chart Integration Speech Bubbles Modus Operandi Tutorial<\/p><\/div>\n<p>Onto yesterday&#8217;s <a title='Google Chart Geo Chart Integration Speech Bubbles Tutorial' href='#gcgcisbt'>Google Chart Geo Chart Integration Speech Bubbles Tutorial<\/a> &#8230;<\/p>\n<ul>\n<li>web browser address bar &#8220;hashtag add&#8221; modus operandi for potential <a title=\"Google Chart Tools provide a perfect way to visualize data on your website. From simple line charts to complex hierarchical tree maps, the chart galley provides a large number of well-designed chart types. Populating your data is easy using the provided client- and server-side tools.\" href=\"https:\/\/developers.google.com\/chart\/interactive\/docs\/index\" target=\"_blank\" rel=\"noopener\">Google Chart<\/a> <a target=\"_blank\" title='Google Chart Geo Chart information from Google' href='https:\/\/developers.google.com\/chart\/interactive\/docs\/gallery\/geochart' rel=\"noopener\">Geo Chart<\/a> Integration Speech Bubbles via our integration with the <a target=\"_blank\" title='Python cowsay' href='https:\/\/pypi.org\/project\/cowsay\/' rel=\"noopener\"><i>cowsay<\/i><\/a> Python API \/ Command-line tool &#8230; today we add the less kludgy &#8230;<\/li>\n<li>non-mobile, ? and &#038; argumented URL, hidden typing option to create Google Chart Geo Chart Integration Speech Bubbles<\/li>\n<\/ul>\n<p> &#8230; via <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/gchartgen.js----------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/gchartgen.js----------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">gchartgen.js<\/a> external Javascript helper <i>onkeydown<\/i> keyboard event Javascript code &#8230;<\/p>\n<p><code><br \/>\nfunction gcokd(evt) {<br \/>\n    var char = 0;<br \/>\n    var kcs=[\";\".charCodeAt(0),\"186\",\"=\".charCodeAt(0),\"187\",\",\".charCodeAt(0),\"188\",\"-\".charCodeAt(0),\"189\",\".\".charCodeAt(0),\"190\",\"\/\".charCodeAt(0),\"191\",\"`\".charCodeAt(0),\"192\",\"[\".charCodeAt(0),\"219\",\"\\\\\".charCodeAt(0),\"220\",\"]\".charCodeAt(0),\"221\",\"'\".charCodeAt(0),\"222\"];<br \/>\n    var belows=[\"`\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"0\",\"-\",\"=\",\"[\",\"]\",\";\",\"'\",\",\",\".\",\"\/\",\"\\\\\"];<br \/>\n    var aboves=['~','!','@','#','$','%','^','&','*','(',')','_','+','{','}',':','\"','&lt;','&gt;','?', '|']<br \/>\n    if (nomoreokd) {<br \/>\n      \/\/document.title='no';<br \/>\n      return true;<br \/>\n    }<br \/>\n    if (evt.altKey && lastkeymodifier != 'a') {<br \/>\n      lastkeymodifier='a';<br \/>\n      return true;<br \/>\n    } else if (evt.ctrlKey && lastkeymodifier != 'c') {<br \/>\n      lastkeymodifier='c';<br \/>\n      return true;<br \/>\n    } else if (evt.shiftKey && lastkeymodifier != 's') {<br \/>\n      lastkeymodifier='s';<br \/>\n      char = evt.which || evt.keyCode;<br \/>\n      if (kcs.indexOf('' + (evt.which || evt.keyCode)) != -1) {<br \/>\n        char=(kcs[eval(-1 + kcs.indexOf('' + (evt.which || evt.keyCode)))]); \/\/.charCodeAt(0);<br \/>\n      }<br \/>\n      if (char == 46 || char == 8) {<br \/>\n      if (okdcommentary != '') {<br \/>\n        okdcommentary.substring(0,eval(-1 + okdcommentary.length));<br \/>\n    if (('' + location.hash).indexOf('commentary=') != -1) {<br \/>\n      if (okdcommentary != '') {<br \/>\n      location.hash='#commentary=' + encodeURIComponent(okdcommentary);<br \/>\n      } else {<br \/>\n      location.hash='#commentary=' + encodeURIComponent(okdcommentary);<br \/>\n      }<br \/>\n    } else if (('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'') == '') {<br \/>\n      location.hash='#commentary=' + encodeURIComponent(okdcommentary);<br \/>\n    }<br \/>\n      }<br \/>\n      } else if (char &gt;= 10) {<br \/>\n      console.warn('char=' + char + ' evt.keyCode=' + evt.keyCode + ' evt.which=' + evt.which);<br \/>\n      if (belows.indexOf(String.fromCharCode(char)) != -1) {<br \/>\n      \/\/alert(56);<br \/>\n         char=aboves[belows.indexOf(String.fromCharCode(char))].charCodeAt(0);<br \/>\n      \/\/alert(char);<br \/>\n    okdcommentary+=String.fromCharCode(char);<br \/>\n    \/\/document.title=okdcommentary;<br \/>\n    if (('' + location.hash).indexOf('commentary=') != -1) {<br \/>\n      location.hash+=encodeURIComponent(String.fromCharCode(char));<br \/>\n    } else if (('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'') == '') {<br \/>\n      location.hash='#commentary=' + encodeURIComponent(okdcommentary);<br \/>\n    }<br \/>\n    lastkeymodifier='';<br \/>\n      } else if (String.fromCharCode(char) &gt;= 'A' && String.fromCharCode(char) &lt;= 'Z') {<br \/>\n         char+=('a'.charCodeAt(0) - 'A'.charCodeAt(0));<br \/>\n    okdcommentary+=String.fromCharCode(char);<br \/>\n    \/\/document.title=okdcommentary;<br \/>\n    if (('' + location.hash).indexOf('commentary=') != -1) {<br \/>\n      location.hash+=encodeURIComponent(String.fromCharCode(char));<br \/>\n    } else if (('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'') == '') {<br \/>\n      location.hash='#commentary=' + encodeURIComponent(okdcommentary);<br \/>\n    }<br \/>\n    lastkeymodifier='';<br \/>\n      }<br \/>\n      }<br \/>\n      return true;<br \/>\n    }<br \/>\n    char = evt.which || evt.keyCode;<br \/>\n    \/\/document.title='' + char + ' ... ';<br \/>\n    if (kcs.indexOf('' + (evt.which || evt.keyCode)) != -1) {<br \/>\n        char=(kcs[eval(-1 + kcs.indexOf('' + (evt.which || evt.keyCode)))]); \/\/.charCodeAt(0);<br \/>\n    \/\/document.title+='' + char + ' .=. ';<br \/>\n    }<br \/>\n      if (char == 46 || char == 8) {<br \/>\n      if (okdcommentary != '') {<br \/>\n        okdcommentary.substring(0,eval(-1 + okdcommentary.length));<br \/>\n    if (('' + location.hash).indexOf('commentary=') != -1) {<br \/>\n      if (okdcommentary != '') {<br \/>\n      location.hash='#commentary=' + encodeURIComponent(okdcommentary);<br \/>\n      } else {<br \/>\n      location.hash='#commentary=' + encodeURIComponent(okdcommentary);<br \/>\n      }<br \/>\n    } else if (('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'') == '') {<br \/>\n      location.hash='#commentary=' + encodeURIComponent(okdcommentary);<br \/>\n    }<br \/>\n      }<br \/>\n      } else if (char &gt;= 10) {<br \/>\n    \/\/document.getElementById('myh3').innerHTML='' + char + ' ' + evt.type;<br \/>\n    \/\/var chrCode = char - 48 * Math.floor(char \/ 48); \/\/ thanks to https:\/\/stackoverflow.com\/questions\/1772179\/get-character-value-from-keycode-in-javascript-then-trim<br \/>\n    \/\/var chr = String.fromCharCode((96 &lt;= char) ? chrCode: char);<br \/>\n    \/\/char=chr;<br \/>\n    if (lastkeymodifier == 's' && String.fromCharCode(char) &gt;= 'A' && String.fromCharCode(char) &lt;= 'Z') {<br \/>\n      char+=('a'.charCodeAt(0) - 'A'.charCodeAt(0));<br \/>\n    } else if (String.fromCharCode(char) &gt;= 'A' && String.fromCharCode(char) &lt;= 'Z') {<br \/>\n      char+=('A'.charCodeAt(0) - 'A'.charCodeAt(0));<br \/>\n    }<br \/>\n    if (lastkeymodifier == 's') {<br \/>\n      if (belows.indexOf(String.fromCharCode(char)) != -1) {<br \/>\n      \/\/alert(56);<br \/>\n         char=aboves[belows.indexOf(String.fromCharCode(char))].charCodeAt(0);<br \/>\n      \/\/alert(char);<br \/>\n      }<br \/>\n    }<br \/>\n    okdcommentary+=String.fromCharCode(char);<br \/>\n    \/\/document.title=okdcommentary;<br \/>\n    if (('' + location.hash).indexOf('commentary=') != -1) {<br \/>\n      location.hash+=encodeURIComponent(String.fromCharCode(char));<br \/>\n    } else if (('' + location.hash).replace(\/^undefined\/g,'').replace(\/^null\/g,'') == '') {<br \/>\n      location.hash='#commentary=' + encodeURIComponent(okdcommentary);<br \/>\n    }<br \/>\n    }<br \/>\n    lastkeymodifier='';<br \/>\n    return true;<br \/>\n}<br \/>\n<br \/>\nif (!navigator.userAgent.match(\/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile\/i)) {<br \/>\n  setTimeout(function(){ if (!nomoreokd) { document.body.onkeydown=function(event){ gcokd(event); } } }, 3000);<br \/>\n}<br \/>\n<\/code><\/p>\n<p> &#8230; which <font size=1>non-mobile<\/font> you can <a href='#ifif'>try out for yourself below<\/a> if you like.<\/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\/google-chart-geo-chart-integration-speech-bubbles-modus-operandi-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Modus Operandi Tutorial<\/a>.<\/p-->\n<hr>\n<p id='gcgcisbt'>Previous relevant <a target=\"_blank\" title='Google Chart Geo Chart Integration Speech Bubbles Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/google-chart-geo-chart-integration-speech-bubbles-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart.php\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"Google Chart Geo Chart Integration Speech Bubbles Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart_speech_bubbles.gif\" title=\"Google Chart Geo Chart Integration Speech Bubbles Tutorial\"   \/><\/a><p class=\"wp-caption-text\">Google Chart Geo Chart Integration Speech Bubbles Tutorial<\/p><\/div>\n<p>Yesterday&#8217;s <a title='HTML Canvas Memories Frog Game Speech Bubbles Tutorial' href='#htmlcmfgsbt'>HTML Canvas Memories Frog Game Speech Bubbles Tutorial<\/a> kickstarted us into imagining other ways &#8230;<\/p>\n<ul>\n<li>our inhouse integrated <a target=\"_blank\" title='Python cowsay' href='https:\/\/pypi.org\/project\/cowsay\/' rel=\"noopener\"><i>cowsay<\/i><\/a> Python API \/ Command-line tool interfacing &#8230; could &#8230;<\/li>\n<li>be used as hashtag based commentary or Speech Bubbles for our inhouse integrations with <a title=\"Google Chart Tools provide a perfect way to visualize data on your website. From simple line charts to complex hierarchical tree maps, the chart galley provides a large number of well-designed chart types. Populating your data is easy using the provided client- and server-side tools.\" href=\"https:\/\/developers.google.com\/chart\/interactive\/docs\/index\" target=\"_blank\" rel=\"noopener\">Google Charts<\/a>, our &#8220;first cab off the rank&#8221; trying this idea being the <a target=\"_blank\" title='Google Chart Geo Chart information from Google' href='https:\/\/developers.google.com\/chart\/interactive\/docs\/gallery\/geochart' rel=\"noopener\">Geo Chart<\/a><\/li>\n<\/ul>\n<p>We honed in on the external Javascript called by many Google Chart integrators with <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/gchartgen.js----------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/gchartgen.js----------------------------------GETME\" title=\"geo_chart.php\" rel=\"noopener\">gchartgen.js<\/a> external Javascript helper&#8217;s &#8230;<\/p>\n<p><code><br \/>\nvar washerelhis=(('' + document.URL + '#').split('#')[1]) + ' ';<br \/>\nif (decodeURIComponent(washerelhis).indexOf('commentary=') == 0) {<br \/>\n if (decodeURIComponent(washerelhis).indexOf(',') != -1) {<br \/>\n   location.hash=location.hash.replace(\/\\,\/g,' ').replace(\/\\%44\/g,'%20');<br \/>\n   washerelhis=washerelhis.replace(\/\\,\/g,' ').replace(\/\\%44\/g,'%20');<br \/>\n }<br \/>\n}<br \/>\n<br \/>\nsetInterval(postlhway, 3000);<br \/>\n<\/code><\/p>\n<p> &#8230; timer function <font color=blue>as per<\/font> &#8230;<\/p>\n<p><code><br \/>\nfunction postlhway() {<br \/>\n  var foundu='';<br \/>\n  var rectcg=null;<br \/>\n  var prefoundu='';<br \/>\n  <font color=blue>var herelhis=(('' + document.URL + '#').split('#')[1]);<br \/>\n  if (herelhis == washerelhis && washerelhis != '') {<br \/>\n    herelhis=(('#' + location.hash + '#').replace('##','#').split('#')[1]);<br \/>\n  }<br \/>\n  if (herelhis != washerelhis) {<br \/>\n    if (decodeURIComponent(herelhis).indexOf('commentary=') == 0) {<br \/>\n      if (document.getElementById('ifcom')) {<br \/>\n          document.getElementById('ifcom').src='\/cowsay.php?viagc=transXparent&inwords=' + (herelhis.substring(('commentary=').length).split('&')[0].replace(\/\\+\/g,'%20'));<br \/>\n      } else if (document.getElementById('dpostform') && document.getElementById('myh')) {<br \/>\n          rectcg=document.getElementById('myh').getBoundingClientRect();<br \/>\n          document.getElementById('dpostform').innerHTML+='&lt;iframe allowTransparency=true id=ifcom src=\"\/cowsay.php?viagc=transXparent&inwords=' + (herelhis.substring(('commentary=').length).split('&')[0].replace(\/\\+\/g,'%20')) + '\" frameborder=0 scrolling=no style=\"background-color:transparent;position:absolute;top:' + eval(-10 + rectcg.bottom) + 'px;left:' + rectcg.left + 'px;width:300px;height:72px;z-index:564;\"&gt;&lt;\/iframe&gt;';<br \/>\n      } else if (document.getElementById('dpostform') && document.getElementById('chart_div')) {<br \/>\n          rectcg=document.getElementById('chart_div').getBoundingClientRect();<br \/>\n          document.getElementById('dpostform').innerHTML+='&lt;iframe allowTransparency=true id=ifcom src=\"\/cowsay.php?viagc=transXparent&inwords=' + (herelhis.substring(('commentary=').length).split('&')[0].replace(\/\\+\/g,'%20')) + '\" frameborder=0 scrolling=no style=\"background-color:transparent;position:absolute;top:' + rectcg.top + 'px;left:' + rectcg.left + 'px;width:300px;height:72px;z-index:564;\"&gt;&lt;\/iframe&gt;';<br \/>\n      }<br \/>\n    }<br \/>\n    washerelhis=herelhis;<br \/>\n  }<\/font><br \/>\n  if (bimode == -1) {<br \/>\n    if (document.getElementById('bkcol')) {<br \/>\n      if (('' + document.getElementById('bkcol').style.backgroundImage).toLowerCase().indexOf('url(') != -1) {<br \/>\n         foundu='' + ('' + document.getElementById('bkcol').style.backgroundImage).split('(')[eval(-1 + ('' + document.getElementById('bkcol').style.backgroundImage).split('(').length)].split(')')[0].replace(\/^\\\"\/g,'').replace(\/\\\"$\/g,'').replace(\/^\\'\/g,'').replace(\/\\'$\/g,'');<br \/>\n         bimode=2;<br \/>\n         prefoundu='+';<br \/>\n      }<br \/>\n    }<br \/>\n    if (bimode == -1) {<br \/>\n      if (('' + document.body.style.backgroundImage).toLowerCase().indexOf('url(') != -1) {<br \/>\n         foundu='' + ('' + document.body.style.backgroundImage).split('(')[eval(-1 + ('' + document.body.style.backgroundImage).split('(').length)].split(')')[0].replace(\/^\\\"\/g,'').replace(\/\\\"$\/g,'').replace(\/^\\'\/g,'').replace(\/\\'$\/g,'');<br \/>\n         bimode=1;<br \/>\n    if (document.getElementById('iagc')) {<br \/>\n      document.getElementById('iagc').style.width='1px';<br \/>\n      document.getElementById('iagc').style.height='1px';<br \/>\n    } else {<br \/>\n      setInterval(function(){<br \/>\n      if (document.getElementById('iagc')) {<br \/>\n      document.getElementById('iagc').style.width='1px';<br \/>\n      document.getElementById('iagc').style.height='1px';<br \/>\n      }<br \/>\n      }, 2000);<br \/>\n    }<br \/>\n      } else if (('' + document.body.innerHTML).indexOf('&lt;style&gt; body { background-image:') != -1) {<br \/>\n         foundu='' + ('' + document.body.innerHTML.split('&lt;style&gt; body { background-image:')[1].split('}')[0]).split('(')[eval(-1 + ('' + document.body.innerHTML.split('&lt;style&gt; body { background-image:')[1].split('}')[0]).split('(').length)].split(')')[0].replace(\/^\\\"\/g,'').replace(\/\\\"$\/g,'').replace(\/^\\'\/g,'').replace(\/\\'$\/g,'');<br \/>\n         bimode=1;<br \/>\n    if (document.getElementById('iagc')) {<br \/>\n      document.getElementById('iagc').style.width='1px';<br \/>\n      document.getElementById('iagc').style.height='1px';<br \/>\n    } else {<br \/>\n      setInterval(function(){<br \/>\n      if (document.getElementById('iagc')) {<br \/>\n      document.getElementById('iagc').style.width='1px';<br \/>\n      document.getElementById('iagc').style.height='1px';<br \/>\n      }<br \/>\n      }, 2000);<br \/>\n    }<br \/>\n       } else if (document.getElementById('bitsatend') && ('' + document.getElementById('bitsatend').innerHTML).indexOf('&lt;style&gt; body { background-image:') != -1) {<br \/>\n         foundu='' + ('' + document.getElementById('bitsatend').innerHTML.split('&lt;style&gt; body { background-image:')[1].split('}')[0]).split('(')[eval(-1 + ('' + document.getElementById('bitsatend').innerHTML.split('&lt;style&gt; body { background-image:')[1].split('}')[0]).split('(').length)].split(')')[0].replace(\/^\\\"\/g,'').replace(\/\\\"$\/g,'').replace(\/^\\'\/g,'').replace(\/\\'$\/g,'');<br \/>\n         bimode=1;<br \/>\n    if (document.getElementById('iagc')) {<br \/>\n      document.getElementById('iagc').style.width='1px';<br \/>\n      document.getElementById('iagc').style.height='1px';<br \/>\n    } else {<br \/>\n      setInterval(function(){<br \/>\n      if (document.getElementById('iagc')) {<br \/>\n      document.getElementById('iagc').style.width='1px';<br \/>\n      document.getElementById('iagc').style.height='1px';<br \/>\n      }<br \/>\n      }, 2000);<br \/>\n    }<br \/>\n       } else if (document.getElementById('bitsatend') && ('' + document.getElementById('bitsatend').innerHTML).indexOf('&lt;style&gt; #bkcol { background-image:') != -1) {<br \/>\n         foundu='' + ('' + document.getElementById('bitsatend').innerHTML.split('&lt;style&gt; #bkcol { background-image:')[1].split('}')[0]).split('(')[eval(-1 + ('' + document.getElementById('bitsatend').innerHTML.split('&lt;style&gt; #bkcol { background-image:')[1].split('}')[0]).split('(').length)].split(')')[0].replace(\/^\\\"\/g,'').replace(\/\\\"$\/g,'').replace(\/^\\'\/g,'').replace(\/\\'$\/g,'');<br \/>\n         bimode=2;<br \/>\n         prefoundu='+';<br \/>\n    if (document.getElementById('iagc')) {<br \/>\n      document.getElementById('iagc').style.width='1px';<br \/>\n      document.getElementById('iagc').style.height='1px';<br \/>\n    } else {<br \/>\n      setInterval(function(){<br \/>\n      if (document.getElementById('iagc')) {<br \/>\n      document.getElementById('iagc').style.width='1px';<br \/>\n      document.getElementById('iagc').style.height='1px';<br \/>\n      }<br \/>\n      }, 2000);<br \/>\n    }<br \/>\n     }<br \/>\n    }<br \/>\n  }<br \/>\n  if (foundu != '') {<br \/>\n    if (document.getElementById('remail')) {<br \/>\n    if (document.getElementById('remail').href.indexOf(encodeURIComponent('bi=')) == -1) {<br \/>\n      if (document.getElementById('remail').href.indexOf(encodeURIComponent('#')) != -1 && document.getElementById('remail').href.indexOf(encodeURIComponent('&')) != -1) {<br \/>\n      if (3 == 3) {<br \/>\n      document.getElementById('remail').href+='' + encodeURIComponent('&#bi=') + prefoundu + encodeURIComponent(foundu.replace('?',encodeURIComponent('?')).replace('?',encodeURIComponent('&')));<br \/>\n      if (document.getElementById('remail').href.indexOf('&body=') != -1) {<br \/>\n      document.getElementById('rsms').href='sms:&body=' + (document.getElementById('remail').href.split('&body=')[1]);<br \/>\n      } else {<br \/>\n      document.getElementById('rsms').href+='' + encodeURIComponent('&#bi=') + prefoundu + encodeURIComponent(foundu);<br \/>\n      }<br \/>\n      } else {<br \/>\n      document.getElementById('remail').href=document.getElementById('remail').href.replace(encodeURIComponent('&'), encodeURIComponent('&bi=') + prefoundu + encodeURIComponent(foundu.replace('?',encodeURIComponent('?')).replace('?',encodeURIComponent('&')) + '&'));<br \/>\n      if (document.getElementById('remail').href.indexOf('&body=') != -1) {<br \/>\n      document.getElementById('rsms').href='sms:&body=' + (document.getElementById('remail').href.split('&body=')[1]);<br \/>\n      } else {<br \/>\n      document.getElementById('rsms').href=document.getElementById('rsms').href.replace(encodeURIComponent('&'), encodeURIComponent('&bi=') + prefoundu + encodeURIComponent(foundu.replace('?',encodeURIComponent('?')).replace('?',encodeURIComponent('&')) + '&'));<br \/>\n      }<br \/>\n      }<br \/>\n      } else if (document.getElementById('remail').href.indexOf(encodeURIComponent('#')) != -1) {<br \/>\n      document.getElementById('remail').href=document.getElementById('remail').href.replace(encodeURIComponent('#'), encodeURIComponent('#bi=') + prefoundu + encodeURIComponent(foundu.replace('?',encodeURIComponent('?')).replace('?',encodeURIComponent('&')) + '&'));<br \/>\n      if (document.getElementById('remail').href.indexOf('&body=') != -1) {<br \/>\n      document.getElementById('rsms').href='sms:&body=' + (document.getElementById('remail').href.split('&body=')[1]);<br \/>\n      } else {<br \/>\n      document.getElementById('rsms').href=document.getElementById('rsms').href.replace(encodeURIComponent('#'), encodeURIComponent('#bi=') + prefoundu + encodeURIComponent(foundu.replace('?',encodeURIComponent('?')).replace('?',encodeURIComponent('&')) + '&'));<br \/>\n      }<br \/>\n      } else {<br \/>\n      document.getElementById('remail').href+='' + encodeURIComponent('#bi=') + prefoundu + encodeURIComponent(foundu.replace('?',encodeURIComponent('?')).replace('?',encodeURIComponent('&')));<br \/>\n      if (document.getElementById('remail').href.indexOf('&body=') != -1) {<br \/>\n      document.getElementById('rsms').href='sms:&body=' + (document.getElementById('remail').href.split('&body=')[1]);<br \/>\n      } else {<br \/>\n      document.getElementById('rsms').href+='' + encodeURIComponent('#bi=') + prefoundu + encodeURIComponent(foundu.replace('?',encodeURIComponent('?')).replace('?',encodeURIComponent('&')));<br \/>\n      }<br \/>\n      }<br \/>\n    }<br \/>\n    }<br \/>\n  }<br \/>\n}<br \/>\n<\/code><\/p>\n<p> &#8230; combined with <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/cowsay.php---------------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/cowsay.php---------------GETME\" rel=\"noopener\">&#8220;third draft&#8221;<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\">Cartoon creation and email sharing capable<\/a> PHP web application, where it&#8217;s hosting is such that a great degree of transparency is applied &#8230;<\/p>\n<p><iframe id=ifif src='\/\/www.rjmprogramming.com.au\/PHP\/GeoChart\/geo_chart.php?title=My%20World%20Survey&#038;width=556&#038;height=348&#038;country=Country&#038;popularity=Popularity&#038;data=%20[~AU~,45]%20,%20[~BR~,12]#commentary=Southern%20Hemisphere%20Buddies%20vote%20sD-zTwi3_GU%20as%0A%20shower%20song%20' style='width:100%;height:800px;'><\/iframe><\/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\/google-chart-geo-chart-integration-speech-bubbles-tutorial\/' rel=\"noopener\">Google Chart Geo Chart Integration Speech Bubbles Tutorial<\/a>.<\/p-->\n<hr>\n<p id='htmlcmfgsbt'>Previous relevant <a target=\"_blank\" title='HTML Canvas Memories Frog Game Speech Bubbles Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/html-canvas-memories-frog-game-speech-bubbles-tutorial\/' rel=\"noopener\">HTML Canvas Memories Frog Game Speech Bubbles Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"HTML Canvas Memories Frog Game Speech Bubbles Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories_draganddrop_frog_sb.gif\" title=\"HTML Canvas Memories Frog Game Speech Bubbles Tutorial\"   \/><\/a><p class=\"wp-caption-text\">HTML Canvas Memories Frog Game Speech Bubbles Tutorial<\/p><\/div>\n<p>Yesterday&#8217;s <a title='HTML Canvas Memories Frog Game Drag and Drop Tutorial' href='#htmlcmfgddt'>HTML Canvas Memories Frog Game Drag and Drop Tutorial<\/a>&#8216;s new Frog mode of use adds to the degree of difficulty, no doubt.<\/p>\n<p>And so, today, we&#8217;ve decided maybe some Speech Bubbles unique to each frog can be an additional memory aid.  This was the opportunity to involve the great <a target=\"_blank\" title='Python cowsay' href='https:\/\/pypi.org\/project\/cowsay\/' rel=\"noopener\"><i>cowsay<\/i><\/a> Python API \/ Command-line tool which we have written some PHP to integrate with here at RJM Programming.  Add to that some Kermit sayings &#8230;<\/p>\n<p><code><br \/>\nvar rectc=null;<br \/>\n<br \/>\nvar cfttoggle=0;<br \/>\nvar kermitisms=[\"It's not easy \" + String.fromCharCode(10) + \" being green.\",\"Hi-ho, \" + String.fromCharCode(10) + \" Kermit the Frog here!\",\"Life's like a movie, write your own ending. Keep believing, keep pretending.\",\"Someday we'll find it, the rainbow connection. The lovers, the dreamers, and me.\",\"Just because you haven't found your talent yet, doesn't mean you don't have one.\",\"If you have to eat two frogs, eat the ugliest one first.\",\"Here's one other thing that I think every person or frog needs to be creative: friends.\",\"I promised \" + String.fromCharCode(10) + \" me.\",\"Time's fun when you're having \" + String.fromCharCode(10) + \" flies!\",\"May success and a smile always be yours \u2026 even when you're knee-deep in the sticky muck of life.\",<br \/>\n\"It's not easy \" + String.fromCharCode(10) + \" being green\",\"Hi-ho, \" + String.fromCharCode(10) + \" Kermit the Frog here\",\"Life's like a movie, write your own ending. Keep believing, keep pretending\",\"Someday we'll find it, the rainbow connection. The lovers, the dreamers, and me\",\"Just because you haven't found your talent yet, doesn't mean you don't have one\",\"If you have to eat two frogs, eat the ugliest one first\",\"Here's one other thing that I think every person or frog needs to be creative: friends\",\"I promised \" + String.fromCharCode(10) + \" me\",\"Time's fun when you're having \" + String.fromCharCode(10) + \" flies\",\"May success and a smile always be yours \u2026 even when you're knee-deep in the sticky muck of life\",<br \/>\n\"it's not easy \" + String.fromCharCode(10) + \" being green\",\"hi-ho, \" + String.fromCharCode(10) + \" Kermit the Frog here\",\"life's like a movie, write your own ending. Keep believing, keep pretending\",\"someday we'll find it, the rainbow connection. The lovers, the dreamers, and me\",\"just because you haven't found your talent yet, doesn't mean you don't have one\",\"if you have to eat two frogs, eat the ugliest one first\",\"here's one other thing that I think every person or frog needs to be creative: friends\",\"i promised \" + String.fromCharCode(10) + \" me\",\"time's fun when you're having \" + String.fromCharCode(10) + \" flies\",\"may success and a smile always be yours \u2026 even when you're knee-deep in the sticky muck of life\",<br \/>\n\"it's not easy \" + String.fromCharCode(10) + \" being green.\",\"hi-ho, \" + String.fromCharCode(10) + \" Kermit the Frog here!\",\"life's like a movie, write your own ending. Keep believing, keep pretending.\",\"someday we'll find it, the rainbow connection. The lovers, the dreamers, and me.\",\"just because you haven't found your talent yet, doesn't mean you don't have one.\",\"if you have to eat two frogs, eat the ugliest one first.\",\"here's one other thing that I think every person or frog needs to be creative: friends.\",\"i promised \" + String.fromCharCode(10) + \" me.\",\"time's fun when you're having \" + String.fromCharCode(10) + \" flies!\",\"may success and a smile always be yours \u2026 even when you're knee-deep in the sticky muck of life.\",<br \/>\n\"- It's not easy \" + String.fromCharCode(10) + \" being green.\",\"- Hi-ho, \" + String.fromCharCode(10) + \" Kermit the Frog here!\",\"- Life's like a movie, write your own ending. Keep believing, keep pretending.\",\"- Someday we'll find it, the rainbow connection. The lovers, the dreamers, and me.\",\"- Just because you haven't found your talent yet, doesn't mean you don't have one.\",\"- If you have to eat two frogs, eat the ugliest one first.\",\"- Here's one other thing that I think every person or frog needs to be creative: friends.\",\"- I promised \" + String.fromCharCode(10) + \" me.\",\"- Time's fun when you're having \" + String.fromCharCode(10) + \" flies!\",\"- May success and a smile always be yours \u2026 even when you're knee-deep in the sticky muck of life.\",<br \/>\n\"- It's not easy \" + String.fromCharCode(10) + \" being green. -\",\"- Hi-ho, \" + String.fromCharCode(10) + \" Kermit the Frog here! -\"<br \/>\n];<br \/>\nvar kermitismowners=[];<br \/>\nvar kermitismidxs=[];<br \/>\n<br \/>\nfunction cft(inw,xz,yz) {<br \/>\n  var ihuh=-1, jhuh=-1;<br \/>\n  \/\/ cfttoggle=0 onediv =1 twodiv<br \/>\n  \/\/ https:\/\/www.rjmprogramming.com.au\/cowsay.php?inwords=well%20yes<br \/>\n  \/\/ kermitisms[] via kermitismowners[]<br \/>\n  if (!rectc) {<br \/>\n  rectc=document.getElementById('canvaselement').getBoundingClientRect();<br \/>\n  }<br \/>\n  \/\/alert('xz=' + xz + ' and yz=' + yz + ' ' + eval(rectc.left + xz) + ',' + eval(rectc.top + yz));<br \/>\n  yz=eval(rectc.top + yz);<br \/>\n  xz=eval(rectc.left + xz);<br \/>\n  if (eval('' + kermitismowners.length) == 0) {<br \/>\n    while (eval('' + kermitismidxs.length) &lt; eval('' + kermitisms.length)) {<br \/>\n      ihuh=Math.floor(Math.random() * 52);<br \/>\n      while (kermitismidxs.indexOf(ihuh) != -1) {<br \/>\n        ihuh=Math.floor(Math.random() * 52);<br \/>\n      }<br \/>\n      kermitismidxs.push(ihuh);<br \/>\n    }<br \/>\n  }<br \/>\n  jhuh=kermitismowners.indexOf(inw);<br \/>\n  if (jhuh == -1) {<br \/>\n      kermitismowners.push(inw);<br \/>\n  }<br \/>\n  jhuh=kermitismowners.indexOf(inw);<br \/>\n  if (cfttoggle == 0) {<br \/>\n    document.getElementById('twodiv').innerHTML='';<br \/>\n    document.getElementById('onediv').style.position='absolute';<br \/>\n    document.getElementById('onediv').style.top='' + Math.max(0,eval(-80 + yz)) + 'px';<br \/>\n    document.getElementById('onediv').style.left='' + Math.max(0,eval(-240 + xz)) + 'px';<br \/>\n    document.getElementById('onediv').style.width='300px';<br \/>\n    document.getElementById('onediv').style.height='100px';<br \/>\n    \/\/document.getElementById('onediv').style.overflowX='hidden';<br \/>\n    \/\/document.getElementById('onediv').innerHTML='&lt;iframe src=\"\/\/www.rjmprogramming.com.au\/cowsay.php?viamemories=y&inwords=' + encodeURIComponent(kermitisms[kermitismidxs[jhuh]]) + '\" frameborder=0 style=\"position:absolute;top=' + eval(-30 + yz) + 'px;left=' + xz + 'px;width=100px;height:60px;\"&gt;&lt;\/iframe&gt;';<br \/>\n    document.getElementById('onediv').innerHTML='&lt;iframe src=\"\/cowsay.php?viamemories=y&inwords=' + encodeURIComponent(kermitisms[kermitismidxs[jhuh]]) + '\" frameborder=0 scrolling=no style=\"position:absolute;top:' + Math.max(0,eval(-80 + yz)) + 'px;left:' + Math.max(0,eval(-240 + xz)) + 'px;width:300px;height:100px;\"&gt;&lt;\/iframe&gt;';<br \/>\n    cfttoggle=1;<br \/>\n  } else {<br \/>\n    \/\/document.getElementById('onediv').innerHTML='';<br \/>\n    document.getElementById('twodiv').style.position='absolute';<br \/>\n    document.getElementById('twodiv').style.top='' + Math.max(0,eval(-80 + yz)) + 'px';<br \/>\n    document.getElementById('twodiv').style.left='' + Math.max(0,eval(-240 + xz)) + 'px';<br \/>\n    document.getElementById('twodiv').style.width='300px';<br \/>\n    document.getElementById('twodiv').style.height='100px';<br \/>\n    \/\/document.getElementById('twodiv').style.overflowX='hidden';<br \/>\n    \/\/document.getElementById('twodiv').innerHTML='&lt;iframe src=\"\/\/www.rjmprogramming.com.au\/cowsay.php?viamemories=y&inwords=' + encodeURIComponent(kermitisms[kermitismidxs[jhuh]]) + '\" frameborder=0 style=\"position:absolute;top=' + eval(-30 + yz) + 'px;left=' + xz + 'px;width=100px;height:60px;\"&gt;&lt;\/iframe&gt;';<br \/>\n    document.getElementById('twodiv').innerHTML='&lt;iframe src=\"\/cowsay.php?viamemories=y&inwords=' + encodeURIComponent(kermitisms[kermitismidxs[jhuh]]) + '\" frameborder=0 scrolling=no style=\"position:absolute;top:' + Math.max(0,eval(-80 + yz)) + 'px;left:' + Math.max(0,eval(-240 + xz)) + 'px;width:300px;height:100px;\"&gt;&lt;\/iframe&gt;';<br \/>\n    cfttoggle=0;<br \/>\n  }<br \/>\n  \/\/window.open('\/\/www.rjmprogramming.com.au\/cowsay.php?inwords=' + encodeURIComponent(kermitisms[kermitismidxs[jhuh]]),'_blank','top=40,left=40,width=100,height=100');<br \/>\n  <br \/>\n}<br \/>\n<\/code><\/p>\n<p> &#8230; and you have the means to add in that addition Speech Bubble uniquifying functionality in <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html---GETME' title='memories.html' rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html---GETME' title='memories.html' rel=\"noopener\">memories.html<\/a> <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html' title='memories.html' rel=\"noopener\">Memories Game<\/a>.<\/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\/html-canvas-memories-frog-game-speech-bubbles-tutorial\/' rel=\"noopener\">HTML Canvas Memories Frog Game Speech Bubbles Tutorial<\/a>.<\/p-->\n<hr>\n<p id='htmlcmfgddt'>Previous relevant <a target=\"_blank\" title='HTML Canvas Memories Frog Game Drag and Drop Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/html-canvas-memories-frog-game-drag-and-drop-tutorial\/' rel=\"noopener\">HTML Canvas Memories Frog Game Drag and Drop Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"HTML Canvas Memories Frog Game Drag and Drop Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories_draganddrop_frog.gif\" title=\"HTML Canvas Memories Frog Game Drag and Drop Tutorial\"   \/><\/a><p class=\"wp-caption-text\">HTML Canvas Memories Frog Game Drag and Drop Tutorial<\/p><\/div>\n<p>We&#8217;re revisiting the <a title='HTML Canvas Memories Game Drag and Drop Tutorial' href='#htmlcmgddt'>HTML Canvas Memories Game Drag and Drop Tutorial<\/a>&#8216;s &#8230;<\/p>\n<ul>\n<li>Memories card game &#8230; allowing &#8230;<\/li>\n<li>frogs (or toad) images to substitute for the playing card images, as user selected<\/li>\n<\/ul>\n<p> &#8230; the idea arising, again, from my sister&#8217;s great frog photographic selection.<\/p>\n<p>This change involved two phases &#8230;<\/p>\n<ol>\n<li>a phase creating 52 *.jpeg frog images to cover for each of the 52 *.gif playing card images &#8230;<\/li>\n<li>a software change phase<\/li>\n<\/ol>\n<p> &#8230; in <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html--GETME' title='memories.html' rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html--GETME' title='memories.html' rel=\"noopener\">memories.html<\/a> <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html' title='memories.html' rel=\"noopener\">Memories Game<\/a>.<\/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\/html-canvas-memories-frog-game-drag-and-drop-tutorial\/' rel=\"noopener\">HTML Canvas Memories Frog Game Drag and Drop Tutorial<\/a>.<\/p-->\n<hr>\n<p id='htmlcmgddt'>Previous relevant <a target=\"_blank\" title='HTML Canvas Memories Game Drag and Drop Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/html-canvas-memories-game-drag-and-drop-tutorial\/' rel=\"noopener\">HTML Canvas Memories Game Drag and Drop Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"HTML Canvas Memories Game Drag and Drop Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories_draganddrop.jpg\" title=\"HTML Canvas Memories Game Drag and Drop Tutorial\"   id='qwihcct' onmouseover=\"  this.src=this.src.replace('.gif','.xjpeg').replace('.jpeg','.xjpg').replace('.jpg','.xpng').replace('.png','.xgif').replace('.x','.');        \"   \/><\/a><p class=\"wp-caption-text\">HTML Canvas Memories Game Drag and Drop Tutorial<\/p><\/div>\n<p>The <a target=\"_blank\" title='HTML5 canvas element information from w3schools' href='http:\/\/www.w3schools.com\/html\/html5_canvas.asp' rel=\"noopener\">Canvas<\/a> HTML element tag combines with some <a target=\"_blank\" title='Drag and drop information from w3schools' href='http:\/\/www.w3schools.com\/html\/html5_draganddrop.asp' rel=\"noopener\">drag and drop<\/a> event Javascript logic today with our revised Memories Card Game we first developed some time back with <a target=\"_blank\" title='HTML\/Javascript Canvas Memories Card Game Primer Tutorial' href='#hjcmcgpt' rel=\"noopener\">HTML\/Javascript Canvas Memories Card Game Primer Tutorial<\/a> as shown below.  In the same line of thinking was yesterday&#8217;s <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/ITblog\/html-colour-coded-tic-tac-toe-drag-and-drop-tutorial\/' rel=\"noopener\">HTML Colour Coded Tic Tac Toe Drag and Drop Tutorial<\/a>.<\/p>\n<p>An HTML5 canvas element can be used as the container to draw graphics on the fly usually via the use of Javascript functions for rendering and event management.<\/p>\n<p>Today, with this topic, we&#8217;ve focussed on non-mobile platforms with the new drag and drop possibilities, but the old methods, with touch\/click, will still work for mobile platforms, and at a later date we may find room for &#8220;drag and drop&#8221; improvement with the mobile platforms as well &#8230; in the fullness of time &#8230; given the constraints of economic belt tightening &#8230; over the course of the current forward estimates.<\/p>\n<p>So what events, applied directly to the canvas element this time (incidentally, yesterday, this was not the case), were additionally of interest for non-mobile drag and drop functionality (in decreasing order of importance (where the already existant canvas &#8220;onclick&#8221; event remains the most important))?<\/p>\n<ul>\n<li><a target=\"_blank\" title='Event ondragstart information from w3schools' href='http:\/\/www.w3schools.com\/tags\/ev_ondragstart.asp' rel=\"noopener\">ondragstart<\/a>=&#8221;drag(event)&#8221; &#8230; where we can differentiate a drag and drop (of the first card chosen) from a click\/touch<\/li>\n<li><a target=\"_blank\" title='Event onmouseup information from w3schools' href='http:\/\/www.w3schools.com\/tags\/ev_onmouseup.asp' rel=\"noopener\">onmouseup<\/a>=&#8221;omu(event)&#8221; &#8230; where we can get the (x,y) of the second card chosen<\/li>\n<li><a target=\"_blank\" title='Event onmousemove information from w3schools' href='http:\/\/www.w3schools.com\/tags\/ev_onmousemove.asp' rel=\"noopener\">onmousemove<\/a>=&#8221;omo(event)&#8221; &#8230; not really important, but we can show it is a drag and drop up in the HTML h1 wording<\/li>\n<li><a target=\"_blank\" title='Event ondragover information from w3schools' href='http:\/\/www.w3schools.com\/tags\/ev_ondragover.asp' rel=\"noopener\">ondragover<\/a>=&#8221;allowDrop(event)&#8221; &#8230; not called upon for non-mobile<\/li>\n<li><a target=\"_blank\" title='Event ondrop information from w3schools' href='http:\/\/www.w3schools.com\/tags\/ev_ondrop.asp' rel=\"noopener\">ondrop<\/a>=&#8221;drop(event)&#8221; &#8230; not used for non-mobile<\/li>\n<\/ul>\n<p>And what additional property?<\/p>\n<ul>\n<li><a target=\"_blank\" title='Property draggable information from w3schools' href='http:\/\/www.w3schools.com\/tags\/att_global_draggable.asp' rel=\"noopener\">draggable<\/a>=&#8221;true&#8221;<\/li>\n<\/ul>\n<p>The end result on a non-mobile platform is that two cards separately clicked act very much like a drag and drop.  Our drag and drop does not draw the card flopping onto the other, but shows a change in the HTML h1 wording.<\/p>\n<p>Here is a link to some downloadable HTML programming code &#8230; rename to <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html-GETME' title='memories.html' rel=\"noopener\">memories.html<\/a> and how it changed for the tutorial below is described at <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html-GETME' title='memories.html' rel=\"noopener\">this link<\/a>.<\/p>\n<p>And you may want to try a <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html' title='memories.html' rel=\"noopener\">memories.html<\/a>live run<\/a> of this card game that tests your memory, and perseverance, at the very least.<\/p>\n<hr>\n<p id='hjcmcgpt'>Previous relevant <a target=\"_blank\" title='HTML\/Javascript Canvas Memories Card Game Primer Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/htmljavascript-canvas-memories-card-game-primer-tutorial\/' rel=\"noopener\">HTML\/Javascript Canvas Memories Card Game Primer Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html\" rel=\"noopener\"><img decoding=\"async\" style=\"float:left;border: 15px solid pink;\" alt=\"HTML\/Javascript Canvas Memories Card Game Primer Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/Memories.jpg\" title=\"HTML\/Javascript Canvas Memories Card Game Primer Tutorial\"  \/><\/a><p class=\"wp-caption-text\">HTML\/Javascript Canvas Memories Card Game Primer Tutorial<\/p><\/div>\n<p>The Canvas HTML element tag can be used as the container to draw graphics on the fly usually via the use of Javascript functions for rendering and event management.<\/p>\n<p>In today&#8217;s tutorial we mainly use the <a target=\"_blank\" href='http:\/\/www.w3schools.com\/tags\/canvas_drawimage.asp' title='HTML5 Canvas drawImage() method information from w3schools ... thanks' rel=\"noopener\">drawImage<\/a> function to create a webpage where you can play the card game called Memories.<\/p>\n<p>You may want to read more at <a target=\"_blank\" title='HTML Canvas Reference' href='http:\/\/www.w3schools.com\/tags\/ref_canvas.asp' rel=\"noopener\">HTML Canvas Reference<\/a> as a generic reference, or here, at the tutorial <a target=\"_blank\" title='javascript - How do I add a simple onClick event handler to a canvas element? - Stack Overflow' href='http:\/\/stackoverflow.com\/questions\/9880279\/how-do-i-add-a-simple-onclick-event-handler-to-a-canvas-element' rel=\"noopener\">javascript &#8211; How do I add a simple onClick event handler to a canvas element? &#8211; Stack Overflow<\/a>.<\/p>\n<p>As you can imagine, this HTML canvas element, new to HTML5, can be very useful for some practical client-side web functionality.<\/p>\n<p>Link to some downloadable HTML programming code &#8230; rename to <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html_GETME' title='memories.html' rel=\"noopener\">memories.html<\/a>\n<\/p>\n<p>You&#8217;ll notice heavy use of the Javascript <a target=\"_blank\" title='Javascript Math.random() information from w3schools' href='http:\/\/www.w3schools.com\/jsref\/jsref_random.asp' rel=\"noopener\">Math.random()<\/a> function.<\/p>\n<p>We hope you enjoy this Memories Card Game tutorial <a target=\"_blank\" title='Canvas HTML element live run tutorial' href=\"http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/memories.html\" rel=\"noopener\">live run<\/a>.<\/p>\n<p>Yes &#8230; you&#8217;ve reached the end &#8230; have a top supportive day full of happy memories!<\/p>\n<p><b>Stop Press<\/b><\/p>\n<p>As of the 5th June 2015 you may notice this game changed to add functionality, and that the live run above might support some drag and drop functionality on non-mobile platforms so you may want to compare this to an <a target=\"_blank\" title='Canvas HTML element live run tutorial' href=\"http:\/\/www.rjmprogramming.com.au\/Games\/Memories\/index.html\" rel=\"noopener\">old live run<\/a> for how it worked before this date.<\/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='#d8104' onclick='var dv=document.getElementById(\"d8104\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"http:\/\/www.rjmprogramming.com.au\/wordpress\/?tag=games-2\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d8104' 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='#d15259' onclick='var dv=document.getElementById(\"d15259\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/?tag=drag-and-drop\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d15259' 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='#d72360' onclick='var dv=document.getElementById(\"d72360\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/canvas\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d72360' 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='#d72364' onclick='var dv=document.getElementById(\"d72364\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/cowsay\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d72364' 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='#d72367' onclick='var dv=document.getElementById(\"d72367\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/transparency\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d72367' 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='#d72374' onclick='var dv=document.getElementById(\"d72374\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/onkeydown\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d72374' 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='#d72381' onclick='var dv=document.getElementById(\"d72381\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/onclick\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d72381' 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='#d72394' onclick='var dv=document.getElementById(\"d72394\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/onblur\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d72394' 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='#d72400' onclick='var dv=document.getElementById(\"d72400\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/say\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d72400' 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='#d72407' onclick='var dv=document.getElementById(\"d72407\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/javascript\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d72407' 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='#d72426' onclick='var dv=document.getElementById(\"d72426\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/relative-url\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d72426' 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='#d72426' onclick='var dv=document.getElementById(\"d72426\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/relative-url\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d72426' 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='#d72451' onclick='var dv=document.getElementById(\"d72451\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/popup\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d72451' 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='#d72501' onclick='var dv=document.getElementById(\"d72501\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/live-captions\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d72501' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Changed within the thread of blog postings of the recent Google Chart Geo Chart Integration Speech Bubbles Popup Div Hashtag Tutorial was our PHP interfacer web application to &#8230; say &#8230; macOS command line tool for Text to Speech functionality. &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/live-captions-interfacing-to-text-to-speech-interfacing-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,29,37],"tags":[5069,5457,2571,233,249,439,520,1560,5455,5456,2178,885,932,3284,1620,1083,2350,1236,1319,1404,1493],"class_list":["post-72501","post","type-post","status-publish","format-standard","hentry","category-elearning","category-event-driven-programming","category-operating-system","category-tutorials","tag-accessibility","tag-audio-to-text","tag-caption","tag-command","tag-configuration","tag-firefox","tag-google-chrome","tag-language","tag-live-caption","tag-live-captions","tag-macos","tag-operating-system-2","tag-php","tag-preferences","tag-region","tag-safari","tag-say","tag-system-preferences","tag-tutorial","tag-web-browser","tag-youtube"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/72501"}],"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=72501"}],"version-history":[{"count":12,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/72501\/revisions"}],"predecessor-version":[{"id":72514,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/72501\/revisions\/72514"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=72501"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=72501"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=72501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}