{"id":66282,"date":"2024-12-31T03:01:00","date_gmt":"2024-12-30T17:01:00","guid":{"rendered":"https:\/\/www.rjmprogramming.com.au\/ITblog\/?p=66282"},"modified":"2024-12-31T18:24:32","modified_gmt":"2024-12-31T08:24:32","slug":"local-file-browsing-tool-stringency-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/local-file-browsing-tool-stringency-tutorial\/","title":{"rendered":"Local File Browsing Tool Stringency Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Local File Browsing Tool Stringency Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing_stringency.jpg\" title=\"Local File Browsing Tool Stringency Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Local File Browsing Tool Stringency Tutorial<\/p><\/div>\n<p>We tend to stand up and take notice when a &#8220;middleperson tool&#8221;, in the web application &#8220;scheme of things&#8221;, needs a change to improve a situation.  Yesterday&#8217;s <a title='Open File Picker Experimental Status Tutorial' href='#ofpest' rel=\"noopener\">Open File Picker Experimental Status Tutorial<\/a> &#8220;middleperson tool&#8221;, our inhouse local file browsing <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm\" rel=\"noopener\">client_browsing.htm<\/a> helper tool, is the case in point, for us, today.<\/p>\n<p>With such a &#8220;tool&#8221; we tend to want it &#8230;<\/p>\n<ul>\n<li>open and flexible &#8230; in the short term &#8230; but as it matures in usability you might start thinking to &#8230;<\/li>\n<li>allow it, depending on the call, be &#8220;buttoned down&#8221; and &#8220;stringent&#8221;<\/li>\n<\/ul>\n<p> &#8230; so that it only helps when the call parameters suggest it should.  This is a sign of maturity with a &#8220;tool&#8221;, and if you want to string inhouse functionality together, you will rely on these well designed and modular &#8220;tools&#8221; you develop as you proceed.  Please feed functionality into these &#8220;tools&#8221; rather than spreading it to &#8220;one off&#8221; web applications you are apt to forget exist over time, we&#8217;re recommending.<\/p>\n<p>We&#8217;ve thought of a requirement, affecting local file browsing input functionality, that wil require &#8230;<\/p>\n<ul>\n<li>exactly two <font size=1>(local files)<\/font> selected<\/li>\n<li>of two <i>mimetype specifications<\/i> ( ie. a mimetype where the second part is * &#8230; eg. <i>image\/*<\/i> ) that must match<\/li>\n<\/ul>\n<p> &#8230; else we&#8217;d like our local file browsing <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm\" rel=\"noopener\">client_browsing.htm<\/a> helper tool bail out, supplying no data information back to any parent caller web application.<\/p>\n<p>This is definitely a piece of functionality we can make our &#8220;middleperson tool&#8221; be capable of taking on, so, like we say above, that &#8220;middleperson tool&#8221; should be modified to take on this new capablity, and have any calling web application start using a new GET arguments ( ie. ? and &#038; URL ) arrangement when they need this new &#8220;stringency&#8221;.<\/p>\n<p>And so <font color=blue>we&#8217;re adding two new GET argument logics<\/font> into &#8220;it&#8217;s mix&#8221; &#8230;<\/p>\n<ol>\n<li><i>numhastobe=<\/i>[number of files to be selected] &#8230; optional &#8230; and\/or &#8230;<\/li>\n<li><i>typehastobe=<\/i>[list of <i>mimetype specifications<\/i> to satisfy] &#8230; optional<\/li>\n<\/ul>\n<p> &#8230; where &#8230;<\/p>\n<p><code><br \/>\n  function readBlob(opt_startByte, opt_stopByte) {<br \/>\n    var hsf=\"\", ourij=0, myform='';<br \/>\n    var blks=' ', variiuy=0, xssuffix='0', xnsuffix='2';<br \/>\n    var defto='html';<br \/>\n    var midw='_this_';<br \/>\n    <br \/>\n    isag=-1;<br \/>\n<br \/>\n    files = document.getElementById('files').files;<br \/>\n    xx=[];<br \/>\n    yy=[];<br \/>\n    ten=500;<br \/>\n    ixy=0;<br \/>\n    awis=[];<br \/>\n    ahis=[];<br \/>\n    awx=[];<br \/>\n    awy=[];<br \/>\n    awid=[];<br \/>\n    reader=[];<br \/>\n    blob=[];<br \/>\n    \/\/imgo=[];<br \/>\n    var ij=0;<br \/>\n    kij=0;<br \/>\n    kkij=0;<br \/>\n    lastiw=0;<br \/>\n    lastih=0;<br \/>\n    if (!files.length) {<br \/>\n      alert('Please select a file!');<br \/>\n      return;<br \/>\n    }<br \/>\n    iinum=files.length;<br \/>\n    if (window.parent && eval('' + iinum) &gt; 0) {<br \/>\n          if (parent.document.getElementById('inum')) {<br \/>\n            parent.document.getElementById('inum').value='' + iinum;<br \/>\n          }<br \/>\n    }<br \/>\n    jjnum=0;<br \/>\n    var aneg='-';<br \/>\n    var vneg='-';<br \/>\n    <font color=blue>var isnworry=false;<br \/>\n    var typeshavetobe=(location.search.split('typehastobe=')[1] ? ('' + (decodeURIComponent(location.search.split('typehastobe=')[1].split('&')[0]))) : ' ');<br \/>\n    var isn=(location.search.split('numhastobe=')[1] ? eval('' + (decodeURIComponent(location.search.split('numhastobe=')[1].split('&')[0]))) : 0);<br \/>\n    if (isn &gt; 0) {<br \/>\n     isnworry=(location.search.split('numhastobe=')[1] ? (iinum != eval('' + (decodeURIComponent(location.search.split('numhastobe=')[1].split('&')[0])))) : false);<br \/>\n    }<br \/>\n    if (isnworry) {<br \/>\n     if (typeshavetobe.trim() != '') {<br \/>\n     alert('Have to select ' + isn + ' files that are ' + typeshavetobe.replace(\/video\/g, ' video ').replace(\/pdf\/g, ' pdf ').replace(\/document\/g, ' document ').replace(\/audio\/g, ' audio ').replace(\/image\/g, ' image ').replace(\/text\/g, ' text ').replace(\/application\/g, ' application ') + ' type files.');<br \/>\n     } else {<br \/>\n     alert('Have to select ' + isn + ' files.');<br \/>\n     }<br \/>\n     <\/font><font color=purple>return '';<\/font><font color=blue><br \/>\n    }<br \/>\n    if (typeshavetobe != '') {<br \/>\n    wastypeshavetobe=typeshavetobe;<br \/>\n    for (ij=0; ij&lt;files.length; ij++) {<br \/>\n    typeshavetobe=typeshavetobe.replace(('' + files[ij].type), '');<br \/>\n    typeshavetobe=typeshavetobe.replace(('' + files[ij].type).split('\/')[0], '');<br \/>\n    if (files[ij].type.indexOf('\/') != -1) {<br \/>\n    typeshavetobe=typeshavetobe.replace(('' + files[ij].type).split('\/')[1], '');<br \/>\n    }<br \/>\n    }<br \/>\n    if (typeshavetobe.replace(\/\\\/\/g,'').replace(\/\\*\\.\/g,'').replace(\/\\,\/g,'').trim() != '') {<br \/>\n     alert('Have to select ' + wastypeshavetobe.replace(\/video\/g, ' video ').replace(\/audio\/g, ' audio ').replace(\/pdf\/g, ' pdf ').replace(\/document\/g, ' document ').replace(\/image\/g, ' image ').replace(\/text\/g, ' text ').replace(\/application\/g, ' application ') + ' type files.');<br \/>\n     <\/font><font color=purple>return '';<\/font><font color=blue><br \/>\n    }<br \/>\n    }<\/font><br \/>\n    for (ij=0; ij&lt;files.length; ij++) {<br \/>\n      \/\/ go on and do lots more logic here that would send information back to the calling parent web application<br \/>\n    }<br \/>\n  }<br \/>\n<\/code><\/p>\n<p> &#8230; incorporating <font color=purple>additional bailing out<\/font> possibilities in <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html--------------------------------------------------GETME' rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html--------------------------------------------------GETME' rel=\"noopener\">client_browsing.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm\" rel=\"noopener\">&#8220;middleperson tool&#8221;<\/a> you can see below using URL <a target=\"_blank\" title='https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm?numhastobe=3&#038;typehastobe=imageaudiopdf' href='\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm?numhastobe=3&#038;typehastobe=imageaudiopdf' rel=\"noopener\"><i>https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm?numhastobe=3&#038;typehastobe=imageaudiopdf<\/i><\/a> in a scenario where it will only accept three image or audio or PDF local input files &#8230;<\/p>\n<p><iframe style=width:100%;height:500px; src='\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm?numhastobe=3&#038;typehastobe=imageaudiopdf'><\/iframe><\/p>\n<p>Some &#8220;middleperson tools&#8221; are never meant to be standalone entities, but the job of testing changes is even easier when they are, because you can debug and step through your changes just by calling them up at the web browser address bar, to test new functionality, and that you haven&#8217;t stuffed any existant old functionality <font size=1>(which, after all, is even more important when the tests concern a &#8220;middleperson tool&#8221;)<\/font>.<\/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\/new-open-file-picker-experimental-status-tutorial\/' rel=\"noopener\">New Open File Picker Experimental Status Tutorial<\/a>.<\/p-->\n<div id=divsp style=display:block;>\n<p><b><i>Stop Press<\/i><\/b><\/p>\n<p>Can you guess the musical connections?  Happy new year!<\/p>\n<details onclick=\"document.getElementById('ifbtob').src=document.getElementById('ifbtob').src.replace('=off','=on');\">\n<summary>BtoB<\/summary>\n<p><iframe style=width:100%;height:900px; id=ifbtob onload=\"if (top.document.URL.indexOf('showit=') != -1) { document.getElementById('divsp').style.display='block'; } \" src='\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=Klh7sAv9hu4&#038;youtube_duration=214.000&#038;email=&#038;email=&#038;emoji=on&#038;c0=off&#038;i0=0&#038;j0=214&#038;i1=&#038;j1=&#038;i2=&#038;j2=&#038;i3=&#038;j3=&#038;i4=&#038;j4=&#038;i5=&#038;j5=&#038;i6=&#038;j6=&#038;i7=&#038;j7=&#038;i8=&#038;j8=&#038;i9=&#038;j9=&#038;i10=&#038;j10=&#038;i11=&#038;j11=&#038;i12=&#038;j12=&#038;i13=&#038;j13=&#038;i14=&#038;j14=&#038;i15=&#038;j15=&#038;i16=&#038;j16=&#038;i17=&#038;j17=&#038;i18=&#038;j18=&#038;i19=&#038;j19=&#038;i20=&#038;j20=&#038;i21=&#038;j21=&#038;i22=&#038;j22=&#038;i23=&#038;j23=&#038;i24=&#038;j24=&#038;i25=&#038;j25=&#038;i26=&#038;j26=&#038;i27=&#038;j27=&#038;i28=&#038;j28=&#038;i29=&#038;j29='><\/iframe><br \/>\n<\/details>\n<details onclick=\"document.getElementById('ifbtobtwo').src=document.getElementById('ifbtobtwo').src.replace('=off','=on');\">\n<summary>Tmol<\/summary>\n<p><iframe style=width:100%;height:900px; id=ifbtobtwo onload=\"if (top.document.URL.indexOf('showit=') != -1) { document.getElementById('divsp').style.display='block'; } \" src='\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=fx2ns6fC4nw&#038;youtube_duration=273.000&#038;email=&#038;email=&#038;emoji=on&#038;c0=off&#038;i0=0&#038;j0=273&#038;i1=&#038;j1=&#038;i2=&#038;j2=&#038;i3=&#038;j3=&#038;i4=&#038;j4=&#038;i5=&#038;j5=&#038;i6=&#038;j6=&#038;i7=&#038;j7=&#038;i8=&#038;j8=&#038;i9=&#038;j9=&#038;i10=&#038;j10=&#038;i11=&#038;j11=&#038;i12=&#038;j12=&#038;i13=&#038;j13=&#038;i14=&#038;j14=&#038;i15=&#038;j15=&#038;i16=&#038;j16=&#038;i17=&#038;j17=&#038;i18=&#038;j18=&#038;i19=&#038;j19=&#038;i20=&#038;j20=&#038;i21=&#038;j21=&#038;i22=&#038;j22=&#038;i23=&#038;j23=&#038;i24=&#038;j24=&#038;i25=&#038;j25=&#038;i26=&#038;j26=&#038;i27=&#038;j27=&#038;i28=&#038;j28=&#038;i29=&#038;j29='><\/iframe><br \/>\n<\/details>\n<details onclick=\"document.getElementById('ifbtobthree').src=document.getElementById('ifbtobthree').src.replace('=off','=on');\">\n<summary>Glue<\/summary>\n<p><iframe style=width:100%;height:900px; id=ifbtobthree onload=\"if (top.document.URL.indexOf('showit=') != -1) { document.getElementById('divsp').style.display='block'; } \" src='\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=k4V3Mo61fJM&#038;youtube_duration=313.000&#038;email=&#038;email=&#038;emoji=on&#038;c0=off&#038;i0=0&#038;j0=313&#038;i1=&#038;j1=&#038;i2=&#038;j2=&#038;i3=&#038;j3=&#038;i4=&#038;j4=&#038;i5=&#038;j5=&#038;i6=&#038;j6=&#038;i7=&#038;j7=&#038;i8=&#038;j8=&#038;i9=&#038;j9=&#038;i10=&#038;j10=&#038;i11=&#038;j11=&#038;i12=&#038;j12=&#038;i13=&#038;j13=&#038;i14=&#038;j14=&#038;i15=&#038;j15=&#038;i16=&#038;j16=&#038;i17=&#038;j17=&#038;i18=&#038;j18=&#038;i19=&#038;j19=&#038;i20=&#038;j20=&#038;i21=&#038;j21=&#038;i22=&#038;j22=&#038;i23=&#038;j23=&#038;i24=&#038;j24=&#038;i25=&#038;j25=&#038;i26=&#038;j26=&#038;i27=&#038;j27=&#038;i28=&#038;j28=&#038;i29=&#038;j29='><\/iframe><br \/>\n<\/details>\n<details onclick=\"document.getElementById('ifbtobpostthree').src=document.getElementById('ifbtobpostthree').src.replace('=off','=on');\">\n<summary>IHad<\/summary>\n<p><iframe style=width:100%;height:900px; id=ifbtobpostthree onload=\"if (top.document.URL.indexOf('showit=') != -1) { document.getElementById('divsp').style.display='block'; } \" src='\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=-p6OH7FoWoQ&#038;youtube_duration=263.000&#038;email=&#038;email=&#038;emoji=on&#038;c0=off&#038;i0=0&#038;j0=263&#038;i1=&#038;j1=&#038;i2=&#038;j2=&#038;i3=&#038;j3=&#038;i4=&#038;j4=&#038;i5=&#038;j5=&#038;i6=&#038;j6=&#038;i7=&#038;j7=&#038;i8=&#038;j8=&#038;i9=&#038;j9=&#038;i10=&#038;j10=&#038;i11=&#038;j11=&#038;i12=&#038;j12=&#038;i13=&#038;j13=&#038;i14=&#038;j14=&#038;i15=&#038;j15=&#038;i16=&#038;j16=&#038;i17=&#038;j17=&#038;i18=&#038;j18=&#038;i19=&#038;j19=&#038;i20=&#038;j20=&#038;i21=&#038;j21=&#038;i22=&#038;j22=&#038;i23=&#038;j23=&#038;i24=&#038;j24=&#038;i25=&#038;j25=&#038;i26=&#038;j26=&#038;i27=&#038;j27=&#038;i28=&#038;j28=&#038;i29=&#038;j29='><\/iframe><br \/>\n<\/details>\n<details onclick=\"document.getElementById('ifbtobfour').src=document.getElementById('ifbtobfour').src.replace('=off','=on');\">\n<summary>F1<\/summary>\n<p><iframe style=width:100%;height:900px; id=ifbtobfour onload=\"if (top.document.URL.indexOf('showit=') != -1) { document.getElementById('divsp').style.display='block'; } \" src='\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=AIOAlaACuv4&#038;youtube_duration=161.000&#038;email=&#038;email=&#038;emoji=on&#038;c0=off&#038;i0=0&#038;j0=161&#038;i1=&#038;j1=&#038;i2=&#038;j2=&#038;i3=&#038;j3=&#038;i4=&#038;j4=&#038;i5=&#038;j5=&#038;i6=&#038;j6=&#038;i7=&#038;j7=&#038;i8=&#038;j8=&#038;i9=&#038;j9=&#038;i10=&#038;j10=&#038;i11=&#038;j11=&#038;i12=&#038;j12=&#038;i13=&#038;j13=&#038;i14=&#038;j14=&#038;i15=&#038;j15=&#038;i16=&#038;j16=&#038;i17=&#038;j17=&#038;i18=&#038;j18=&#038;i19=&#038;j19=&#038;i20=&#038;j20=&#038;i21=&#038;j21=&#038;i22=&#038;j22=&#038;i23=&#038;j23=&#038;i24=&#038;j24=&#038;i25=&#038;j25=&#038;i26=&#038;j26=&#038;i27=&#038;j27=&#038;i28=&#038;j28=&#038;i29=&#038;j29='><\/iframe><br \/>\n<\/details>\n<details onclick=\"document.getElementById('ifbtobfive').src=document.getElementById('ifbtobfive').src.replace('=off','=on');\">\n<summary>90am<\/summary>\n<p><iframe style=width:100%;height:900px; id=ifbtobfive onload=\"if (top.document.URL.indexOf('showit=') != -1) { document.getElementById('divsp').style.display='block'; } \" src='\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=HTzGMEfbnAw&#038;youtube_duration=233.000&#038;email=&#038;email=&#038;emoji=on&#038;c0=off&#038;i0=0&#038;j0=233&#038;i1=&#038;j1=&#038;i2=&#038;j2=&#038;i3=&#038;j3=&#038;i4=&#038;j4=&#038;i5=&#038;j5=&#038;i6=&#038;j6=&#038;i7=&#038;j7=&#038;i8=&#038;j8=&#038;i9=&#038;j9=&#038;i10=&#038;j10=&#038;i11=&#038;j11=&#038;i12=&#038;j12=&#038;i13=&#038;j13=&#038;i14=&#038;j14=&#038;i15=&#038;j15=&#038;i16=&#038;j16=&#038;i17=&#038;j17=&#038;i18=&#038;j18=&#038;i19=&#038;j19=&#038;i20=&#038;j20=&#038;i21=&#038;j21=&#038;i22=&#038;j22=&#038;i23=&#038;j23=&#038;i24=&#038;j24=&#038;i25=&#038;j25=&#038;i26=&#038;j26=&#038;i27=&#038;j27=&#038;i28=&#038;j28=&#038;i29=&#038;j29='><\/iframe><br \/>\n<\/details>\n<details onclick=\"document.getElementById('ifbtobpresix').src=document.getElementById('ifbtobpresix').src.replace('=off','=on');\">\n<summary>Sshh<\/summary>\n<p><iframe style=width:100%;height:900px; id=ifbtobpresix onload=\"if (top.document.URL.indexOf('showit=') != -1) { document.getElementById('divsp').style.display='block'; } \" src='\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=CW_ZiojrkVY&#038;youtube_duration=224.000&#038;email=&#038;email=&#038;emoji=on&#038;c0=off&#038;i0=0&#038;j0=224&#038;i1=&#038;j1=&#038;i2=&#038;j2=&#038;i3=&#038;j3=&#038;i4=&#038;j4=&#038;i5=&#038;j5=&#038;i6=&#038;j6=&#038;i7=&#038;j7=&#038;i8=&#038;j8=&#038;i9=&#038;j9=&#038;i10=&#038;j10=&#038;i11=&#038;j11=&#038;i12=&#038;j12=&#038;i13=&#038;j13=&#038;i14=&#038;j14=&#038;i15=&#038;j15=&#038;i16=&#038;j16=&#038;i17=&#038;j17=&#038;i18=&#038;j18=&#038;i19=&#038;j19=&#038;i20=&#038;j20=&#038;i21=&#038;j21=&#038;i22=&#038;j22=&#038;i23=&#038;j23=&#038;i24=&#038;j24=&#038;i25=&#038;j25=&#038;i26=&#038;j26=&#038;i27=&#038;j27=&#038;i28=&#038;j28=&#038;i29=&#038;j29='><\/iframe><br \/>\n<\/details>\n<details onclick=\"document.getElementById('ifbtobsix').src=document.getElementById('ifbtobsix').src.replace('=off','=on');\">\n<summary>Faith<\/summary>\n<p><iframe style=width:100%;height:900px; id=ifbtobsix onload=\"if (top.document.URL.indexOf('showit=') != -1) { document.getElementById('divsp').style.display='block'; } \" src='\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=FtE3hoR_Nvo&#038;youtube_duration=239.000&#038;email=&#038;email=&#038;emoji=on&#038;c0=off&#038;i0=0&#038;j0=239&#038;i1=&#038;j1=&#038;i2=&#038;j2=&#038;i3=&#038;j3=&#038;i4=&#038;j4=&#038;i5=&#038;j5=&#038;i6=&#038;j6=&#038;i7=&#038;j7=&#038;i8=&#038;j8=&#038;i9=&#038;j9=&#038;i10=&#038;j10=&#038;i11=&#038;j11=&#038;i12=&#038;j12=&#038;i13=&#038;j13=&#038;i14=&#038;j14=&#038;i15=&#038;j15=&#038;i16=&#038;j16=&#038;i17=&#038;j17=&#038;i18=&#038;j18=&#038;i19=&#038;j19=&#038;i20=&#038;j20=&#038;i21=&#038;j21=&#038;i22=&#038;j22=&#038;i23=&#038;j23=&#038;i24=&#038;j24=&#038;i25=&#038;j25=&#038;i26=&#038;j26=&#038;i27=&#038;j27=&#038;i28=&#038;j28=&#038;i29=&#038;j29='><\/iframe><br \/>\n<\/details>\n<\/div>\n<hr>\n<p id='ofpest'>Previous relevant <a target=\"_blank\" title='Open File Picker Experimental Status Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/open-file-picker-experimental-status-tutorial\/' rel=\"noopener\">Open File Picker Experimental Status Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Open File Picker Experimental Status Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker_typeof.jpg\" title=\"Open File Picker Experimental Status Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Open File Picker Experimental Status Tutorial<\/p><\/div>\n<p>The basis of yesterday&#8217;s <a title='Open File Picker of PDF Javascript Tutorial' href='#ofppdfjt'>Open File Picker of PDF Javascript Tutorial<\/a>&#8216;s functionality is <a target=\"_blank\" title='Window: showOpenFilePicker() method' href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Window\/showOpenFilePicker' rel=\"noopener\">showOpenFilePicker<\/a>, an experimental Javascript offering.<\/p>\n<p>Which begs the question, at least for us &#8230;<\/p>\n<blockquote><p>\nWhat is the alternative approach to trying a piece of experimental Javascript functionality, only to find your web browser environment does not support it?\n<\/p><\/blockquote>\n<p>Well, there is the great Javascript <a target=\"_blank\" title='Javascript typeof information from W3schools' rel=\"noopener\" href='https:\/\/www.w3schools.com\/js\/js_typeof.asp'>typeof<\/a> operator fitting the bill &#8230;<\/p>\n<blockquote cite='https:\/\/www.w3schools.com\/js\/js_typeof.asp'><p>\nThe typeof operator returns the data type of a JavaScript variable.\n<\/p><\/blockquote>\n<p> &#8230; we&#8217;re applying, now, in <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker.html--GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker.html--GETME\" rel=\"noopener\">file_open_picker.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker.html\" rel=\"noopener\">Open File Picker Interfacing web application<\/a> &#8230;<\/p>\n<p><code><br \/>\n var sofp=('' + typeof(window.showOpenFilePicker));<br \/>\n<br \/>\n if (sofp != 'function') {<br \/>\n  rectx=document.getElementById('divmypdfbut').getBoundingClientRect();<br \/>\n  document.getElementById('divmypdfbut').style.borderLeft='1px dashed red';<br \/>\n  document.getElementById('divmypdfbut').style.position='absolute';<br \/>\n  document.getElementById('divmypdfbut').style.left='50%';<br \/>\n  document.getElementById('divmypdfbut').style.top='' + rectx.top + 'px';<br \/>\n  document.getElementById('divmypdfbut').innerHTML='&lt;iframe onload=checkpif(this); id=ifmypdfbut frameborder=0 style=\"width:' + rectx.width + 'px;height:' + eval(1.5 * eval('' + rectx.height)) + 'px;\" src=\"\/php_calls_pdfimages.php?jghdjh#files\"&gt;&lt;\/iframe&gt;&nbsp;PDF';<br \/>\n  document.getElementById('divmypdfbut').onmouseover=function(){ document.getElementById('divmypdfbut').style.width='700px';  document.getElementById('divmypdfbut').style.height='700px'; document.getElementById('ifmypdfbut').style.width='100%';   document.getElementById('ifmypdfbut').style.height='100%'; };<br \/>\n  document.getElementById('divmypdfbut').onmousedown=function(){ document.getElementById('divmypdfbut').style.width='700px';  document.getElementById('divmypdfbut').style.height='700px'; document.getElementById('ifmypdfbut').style.width='100%';   document.getElementById('ifmypdfbut').style.height='100%'; };<br \/>\n  document.getElementById('divmypdfbut').ontouchdown=function(){ document.getElementById('divmypdfbut').style.width='700px';  document.getElementById('divmypdfbut').style.height='700px'; document.getElementById('ifmypdfbut').style.width='100%';   document.getElementById('ifmypdfbut').style.height='100%'; };<br \/>\n  rectx=document.getElementById('divmybut').getBoundingClientRect();<br \/>\n  document.getElementById('divmybut').style.backgroundColor='yellow';<br \/>\n  document.getElementById('divmybut').style.position='absolute';<br \/>\n  document.getElementById('divmybut').style.left='0%';<br \/>\n  document.getElementById('divmybut').style.top='' + rectx.top + 'px';<br \/>\n  document.getElementById('divmybut').innerHTML='&lt;iframe onload=checkppif(this); id=ifmybut frameborder=0 style=\"width:' + rectx.width + 'px;height:' + eval(1.5 * eval('' + rectx.height)) + 'px;\" src=\"\/HTMLCSS\/user_of_signature_signature.html?fcol=' + Math.floor(Math.random() * 19878565) + '#dcmib\"&gt;&lt;\/iframe&gt;&nbsp;Image';<br \/>\n  document.getElementById('divmybut').onmouseover=function(){ document.getElementById('divmybut').style.width='700px';  document.getElementById('divmybut').style.height='700px'; document.getElementById('ifmybut').style.width='700px';   document.getElementById('ifmybut').style.height='700px'; };<br \/>\n  document.getElementById('divmybut').onmousedown=function(){ document.getElementById('divmybut').style.width='700px';  document.getElementById('divmybut').style.height='700px'; document.getElementById('ifmybut').style.width='700px';   document.getElementById('ifmybut').style.height='700px'; };<br \/>\n  document.getElementById('divmybut').ontouchdown=function(){ document.getElementById('divmybut').style.width='700px';  document.getElementById('divmybut').style.height='700px'; document.getElementById('ifmybut').style.width='700px';   document.getElementById('ifmybut').style.height='700px'; };<br \/>\n }<br \/>\n<\/code><\/p>\n<p> &#8230; meaning web browsers not compatible get supplied web browser webpage functionality turning to our inhouse local file browsing <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm\" rel=\"noopener\">client_browsing.htm<\/a> specialist for alternative help, rather than giving up on the user, doing nothing, <a href='#ifofp'>as you can try below<\/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\/new-open-file-picker-of-pdf-javascript-tutorial\/' rel=\"noopener\">New Open File Picker of PDF Javascript Tutorial<\/a>.<\/p-->\n<hr>\n<p id='ofppdfjt'>Previous relevant <a target=\"_blank\" title='Open File Picker of PDF Javascript Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/open-file-picker-of-pdf-javascript-tutorial\/' rel=\"noopener\">Open File Picker of PDF Javascript Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Open File Picker of PDF Javascript Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker_pdf.jpg\" title=\"Open File Picker of PDF Javascript Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Open File Picker of PDF Javascript Tutorial<\/p><\/div>\n<p>Yesterday&#8217;s <a title='Open File Picker Javascript Primer Tutorial' href='#ofpjpt'>Open File Picker Javascript Primer Tutorial<\/a> browsed for &#8230;<\/p>\n<ul>\n<li>image file &#8230; input data, and today we&#8217;d like to allow for the way to use the same <a target=\"_blank\" title='Window: showOpenFilePicker() method' href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Window\/showOpenFilePicker' rel=\"noopener\">showOpenFilePicker<\/a> means by which to browse for local &#8230;<\/li>\n<li>PDF file<\/li>\n<\/ul>\n<p> &#8230; input data, it being the online world&#8217;s first choice for a &#8220;hard printout&#8221; equivalent means of data expression.  Online users use PDF for so many purposes, so us swivelling to allow for this input data type is likely to gel with what users have stored on their local devices, where the browsing takes place.<\/p>\n<p>Yesterday we &#8230;<\/p>\n<ul>\n<li>allowed for canvas means of editing image data &#8230; and today we &#8230;<\/li>\n<li>allow for the extraction of information from PDF data repositories<\/li>\n<\/ul>\n<p> &#8230; to output data options &#8230;<\/p>\n<ul>\n<li>Video<\/li>\n<li>Animated GIF<\/li>\n<li>Images<\/li>\n<li>HTML<\/li>\n<li>XML<\/li>\n<li>Excel<\/li>\n<li>Word<\/li>\n<li>Powerpoint<\/li>\n<\/ul>\n<p> &#8230; via interfacing to our inhouse <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/php_calls_pdfimages.php-----------------------GETME\" rel=\"noopener\">modified<\/a> &#8230;<\/p>\n<p>&lt;?php<br \/>\n<code><br \/>\nif (isset($_POST['pdfcont']) && isset($_POST['pdfname'])) {<br \/>\n  file_put_contents('\/tmp\/' . basename(str_replace('+',' ',urldecode($_POST['pdfname']))),   base64_decode($_POST['pdfcont']));<br \/>\n  header('Location: .\/php_calls_pdfimages.php?inpath=' . urlencode('\/tmp\/') . '&convertthis=' . urlencode('' . basename(str_replace('+',' ',urldecode($_POST['pdfname'])))));<br \/>\n  exit;<br \/>\n} else if (isset($_GET['pdfcont']) && isset($_GET['pdfname'])) {<br \/>\n  file_put_contents('\/tmp\/' . basename(str_replace('+',' ',urldecode($_GET['pdfname']))),   base64_decode($_GET['pdfcont']));<br \/>\n  header('Location: .\/php_calls_pdfimages.php?inpath=' . urlencode('\/tmp\/') . '&convertthis=' . urlencode('' . basename(str_replace('+',' ',urldecode($_GET['pdfname'])))));<br \/>\n  exit;<br \/>\n}<br \/>\n<\/code><br \/>\n?&gt;<\/p>\n<p> &#8230; <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/php_calls_pdfimages.php-----------------------GETME\" rel=\"noopener\">php_calls_pdfimages.php<\/a> PHP interfacer to the great open source <a target=\"_blank\" title='Pdfimages' href='https:\/\/www.xpdfreader.com\/pdfimages-man.html' rel=\"noopener\">PDFimages<\/a> product <font size=1>(you can read more about interfacing to from <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/ITblog\/pdf-to-images-and-microsoft-office-on-almalinux-tutorial\/' title='PDF to Images and Microsoft Office on AlmaLinux Tutorial' rel=\"noopener\">PDF to Images and Microsoft Office on AlmaLinux Tutorial<\/a>)<\/font> now installed up at RJM Programming&#8217;s AlmaLinux web server helping out <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker.html-GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker.html-GETME\" rel=\"noopener\">file_open_picker.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker.html\" rel=\"noopener\">Open File Picker Interfacing web application<\/a> you can <a href='#ifofp'>also try, alas only successfully on non-mobile platforms (with experimental functionality), below<\/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\/open-file-picker-of-pdf-javascript-tutorial\/' rel=\"noopener\">Open File Picker of PDF Javascript Tutorial<\/a>.<\/p-->\n<hr>\n<p id='ofpjpt'>Previous relevant <a target=\"_blank\" title='Open File Picker Javascript Primer Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/open-file-picker-javascript-primer-tutorial\/' rel=\"noopener\">Open File Picker Javascript 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\/HTMLCSS\/file_open_picker.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Open File Picker Javascript Primer Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker.jpg\" title=\"Open File Picker Javascript Primer Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Open File Picker Javascript Primer Tutorial<\/p><\/div>\n<p>There are other ways to go about local file browsing, regarding web applications using a web browser, than the HTML input type=file element way we&#8217;ve become so fond of here at RJM Programming with <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm\" rel=\"noopener\">client_browsing.htm<\/a> and we&#8217;re here, today, ready to talk about &#8230;<\/p>\n<p><code><br \/>\n<a target=\"_blank\" title='Window: showOpenFilePicker() method' href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Window\/showOpenFilePicker' rel=\"noopener\">Window: showOpenFilePicker() method<\/a><br \/>\n<\/code><\/p>\n<p> &#8230; described as &#8230;<\/p>\n<blockquote cite=''https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Window\/showOpenFilePicker'><p>\nThe showOpenFilePicker() method of the Window interface shows a file picker that allows a user to select a file or multiple files and returns a handle for the file(s).\n<\/p><\/blockquote>\n<p> &#8230; means of achieving this.<\/p>\n<p>Developing a &#8230;<\/p>\n<ul>\n<li>browser for local image file &#8230;<\/li>\n<li>transference of a returned &#8220;piece of data&#8221; &#8230;<\/li>\n<li>used to create an img element object &#8230; and onto &#8230;<\/li>\n<li>an HTML5 canvas element &#8230; via &#8230;<\/li>\n<li>[canvasContext].drawImage([imageElementObject],0,0) &#8230; temporarily in the parent window &#8230; and later &#8230;<\/li>\n<li>to an iframe element for an inhouse image editing via canvas web application<\/li>\n<\/ul>\n<p> &#8230; what took half the day was <font color=purple>the replacement of<\/font> with <font color=blue>this alternative response object return<\/font> as an easier means by which clientside Javascript can convert real image file data into a useful data URI which is needed to form img element content that [canvasContext].drawImage([imgElementObject],0,0) can use to get to an Image Editing scenario &#8230;<\/p>\n<p><code><br \/>\nconst pickerOpts = {<br \/>\n  types: [<br \/>\n    {<br \/>\n      description: \"Images\",<br \/>\n      accept: {<br \/>\n        \"image\/*\": [\".png\", \".gif\", \".jpeg\", \".jpg\"],<br \/>\n      },<br \/>\n    },<br \/>\n  ],<br \/>\n  excludeAcceptAllOption: true,<br \/>\n  multiple: false,<br \/>\n};<br \/>\n<br \/>\n\/\/ create a reference for our file handle<br \/>\nlet fileHandle;<br \/>\n<br \/>\nasync function getFile() {<br \/>\n  \/\/ open file picker, destructure the one element returned array<br \/>\n  [fileHandle] = await window.showOpenFilePicker(pickerOpts);<br \/>\n<br \/>\n  \/\/ run code with our fileHandle<br \/>\n  const file = await fileHandle.getFile();<br \/>\n  const content = await file.<font color=blue>arrayBuffer();<\/font> \/\/<font color=purple>text();<\/font><br \/>\n  const contents = <a target=\"_blank\" title='Thanks a lot' href='https:\/\/stackoverflow.com\/questions\/9267899\/how-can-i-convert-an-arraybuffer-to-a-base64-encoded-string' rel=\"noopener\">_arrayBufferToBase64<\/a>(content);<br \/>\n  \/\/alert('' + file.name + ' ... ' + (contents));<br \/>\n  const canvaso=document.getElementById('canvas');<br \/>\n  const context=canvaso.getContext('2d');<br \/>\n<br \/> <br \/>\n  nimg=new Image();<br \/>\n  <br \/>\n  nimg.onload = (event) =&gt; {<br \/>\n    canvaso.width=event.target.width;<br \/>\n    canvaso.height=event.target.height;<br \/>\n    context.drawImage(event.target, 0, 0);<br \/>\n    document.getElementById('cif').src='\/HTMLCSS\/user_of_signature_signature.html?rand=' + Math.floor(Math.random() * 1987867);<br \/>\n    document.getElementById('cif').style.display='block';<br \/>\n  };<br \/>\n  <br \/>\n  nimg.src='data:image\/' + file.name.split('.')[eval(-1 + file.name.split('.').length)].split('?')[0].split('#')[0].toLowerCase().replace('jpg','jpeg') + ';base64,' + ((((contents))));<br \/>\n}<br \/>\n<\/code><\/p>\n<p> &#8230; within today&#8217;s <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker.html_GETME\" rel=\"noopener\">proof of concept<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker.html\" rel=\"noopener\">Show Open File Picker Image Editing<\/a> web application you can also try, alas only successfully on non-mobile platforms (with experimental functionality), below &#8230;<\/p>\n<p><iframe id=ifofp src=\"\/\/www.rjmprogramming.com.au\/HTMLCSS\/file_open_picker.html\" rel=\"noopener\" style=\"width:100%;height:1200px;\"><\/iframe><\/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='#d66232' onclick='var dv=document.getElementById(\"d66232\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/picker\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d66232' 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='#d66246' onclick='var dv=document.getElementById(\"d66246\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/pdf\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d66246' 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='#d66270' onclick='var dv=document.getElementById(\"d66270\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/typeof\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d66270' 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='#d66282' onclick='var dv=document.getElementById(\"d66282\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/tool\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d66282' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>We tend to stand up and take notice when a &#8220;middleperson tool&#8221;, in the web application &#8220;scheme of things&#8221;, needs a change to improve a situation. Yesterday&#8217;s Open File Picker Experimental Status Tutorial &#8220;middleperson tool&#8221;, our inhouse local file browsing &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/local-file-browsing-tool-stringency-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":[1993,3531,181,3913,3912,1797,418,419,421,2655,5047,3441,576,587,652,4772,2732,5049,1616,802,885,5048,997,1200,5046,2005,1319],"class_list":["post-66282","post","type-post","status-publish","format-standard","hentry","category-elearning","category-event-driven-programming","category-operating-system","category-tutorials","tag-browse","tag-browsing","tag-call","tag-called","tag-caller","tag-extension","tag-file","tag-file-api","tag-file-browsing","tag-file-extension","tag-flexibility","tag-genericity","tag-html","tag-iframe","tag-javascript","tag-local-file","tag-mimetype","tag-modular","tag-modularization","tag-module","tag-operating-system-2","tag-parent-child","tag-programming","tag-stop-press","tag-stringency","tag-tool","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/66282"}],"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=66282"}],"version-history":[{"count":37,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/66282\/revisions"}],"predecessor-version":[{"id":66344,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/66282\/revisions\/66344"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=66282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=66282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=66282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}