{"id":63981,"date":"2024-06-20T03:01:09","date_gmt":"2024-06-19T17:01:09","guid":{"rendered":"http:\/\/www.rjmprogramming.com.au\/ITblog\/?p=63981"},"modified":"2024-09-21T11:20:33","modified_gmt":"2024-09-21T01:20:33","slug":"xml-lnt-validation-css-background-colour-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/xml-lnt-validation-css-background-colour-tutorial\/","title":{"rendered":"XML Lint Validation CSS Background Colour Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"XML Lint Validation CSS Background Colour Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation_css_colour.jpg\" title=\"XML Lint Validation CSS Background Colour Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">XML Lint Validation CSS Background Colour Tutorial<\/p><\/div>\n<p>Onto the recent <a title='XML Lint Validation Shared Encoding Tutorial' href='#xmllvset'>XML Lint Validation Shared Encoding Tutorial<\/a> we&#8217;d say what could &#8220;cheer things up&#8221;, shall we say, is to add some colour into the look of the XML Lint Validation web application.<\/p>\n<p>And to do this with inline CSS &lt;style&gt;&lt;\/style&gt; element within the &lt;head&gt;&lt;\/head&gt; non-body part of the webpage.  We allow the webpage to keep any of its &#8220;style=&#8221; specifications within the &lt;body&gt;&lt;\/body&gt; section too, because, personally speaking, if we thought to do it as we were coding, then the chances are, these CSS specification must hold some weight and should stay.  Today&#8217;s work is an &#8220;overall makeover&#8221; layer of CSS styling &#8220;just for aesthetics&#8221;, which is more the way we tend to organize web application CSS styling aesthetics around here.  It&#8217;s up to you though, <a target=\"_blank\" title=\"?\" href='https:\/\/www.youtube.com\/watch?v=e9_7GcQeiqw&#038;t=2m37s' rel=\"noopener\">obviously<\/a>, and if you have a dedicated CSS styling employee, then you may roll in a different direction &#8230; though <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/rolling.gif\" rel=\"noopener\">Nala and<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/rolling.mov\" rel=\"noopener\">Luna<\/a> will tell you &#8230;<\/p>\n<blockquote><p>\nClockwise is best!\n<\/p><\/blockquote>\n<p>But they would say that!  They&#8217;ve never travelled north of the Equator!<\/p>\n<p>So what CSS styling got applied?<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\n&lt;style&gt;<br \/>\n<br \/>\n  th[colspan]:not([colspan=\"1\"]) {<br \/>\n    background-color: yellow;<br \/>\n  }<br \/>\n  <br \/>\n  textarea:nth-child(1) {<br \/>\n    background-color: silver;<br \/>\n  }<br \/>\n  <br \/>\n  textarea#preincoming {<br \/>\n    background-color: silver;<br \/>\n  }<br \/>\n  <br \/>\n  textarea:nth-child(2) {<br \/>\n    background-color: rgb(245,245,245);<br \/>\n  }<br \/>\n  <br \/>\n  textarea#incoming {<br \/>\n    background-color: rgb(245,245,245);<br \/>\n  }<br \/>\n  <br \/>\n  textarea:nth-child(3) {<br \/>\n    background-color: pink !important;<br \/>\n  }<br \/>\n  <br \/>\n  textarea#outgoing {<br \/>\n    background-color: pink !important;<br \/>\n  }<br \/>\n<br \/>\n&lt;\/style&gt;<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<\/p>\n<p> &#8230; in <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php-----GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php-----GETME\" rel=\"noopener\">&#8220;sixth draft&#8221;<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php_GETME\" rel=\"noopener\">xmllint_validation.php<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php\" rel=\"noopener\">you might want to try for yourself<\/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\/xml-lint-validation-css-background-colour-tutorial\/' rel=\"noopener\">XML Lint Validation CSS Background Colour Tutorial<\/a>.<\/p-->\n<hr>\n<p id='xmllvset'>Previous relevant <a target=\"_blank\" title='XML Lint Validation Shared Encoding Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/xml-lint-validation-shared-encoding-tutorial\/' rel=\"noopener\">XML Lint Validation Shared Encoding 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\/xmllint_validation.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"XML Lint Validation Shared Encoding Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation_sharing.jpg\" title=\"XML Lint Validation Shared Encoding Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">XML Lint Validation Shared Encoding Tutorial<\/p><\/div>\n<p>There are a lot of web applications we&#8217;ve been involved with that &#8230;<\/p>\n<ol>\n<li>try to avoid <font size=1>(what we are most &#8220;peeved&#8221; by, as an issue)<\/font> gobbledegook when dealing with non-ascii content we try, encoding wise, to corral towards UTF-8 encoding &#8230; and today we &#8230;<\/li>\n<li>add sharing and collaboration functionality, via email or SMS, to our current XML Lint Validation <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php\" rel=\"noopener\">web application<\/a> development<\/li>\n<\/ol>\n<p> &#8230; hence the &#8220;Shared Encoding&#8221; curiosity in our blog posting title <font size=1>&#8230; well, you had to be there &#8230;<\/font> today, in the days after yesterday&#8217;s <a title='XML Lint Validation SelectionChange Tutorial' href='#xmllvsct'>XML Lint Validation SelectionChange Tutorial<\/a> &#8230;<\/p>\n<p>Fancy a pertinent riddle?<\/p>\n<blockquote><p>\nWhat is always coming but never arrives?\n<\/p><\/blockquote>\n<p><a target=\"_blank\" title='?' href='https:\/\/www.youtube.com\/watch?v=uhiCFdWeQfA' rel=\"noopener\">Anyone, anyone<\/a>?<\/p>\n<p>Yes, <a target=\"_blank\" href='https:\/\/en.wikipedia.org\/wiki\/Hoagy_Carmichael' rel=\"noopener\">Hoagy<\/a>, do you have an answer?<\/p>\n<blockquote><p>\nNo Bull Cow No Bull\n<\/p><\/blockquote>\n<p>Well, that&#8217;s quite rude and wise all at once, Hoagy!  Anybody else?  Yes, <a target=\"_blank\" title='?' href='https:\/\/en.wikipedia.org\/wiki\/Riddler' rel=\"noopener\">Edward<\/a>, your answer &#8230;<\/p>\n<blockquote><p>\nRearrange the sycophant!\n<\/p><\/blockquote>\n<p> &#8230; has merit too!  But wish one of you would enunciate &#8230; use your words &#8230;<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n.\n<\/p>\n<p>You have the answer <a title='?' href='https:\/\/en.wikipedia.org\/wiki\/Tatsumi_Yoda'>Tatsumi<\/a>?  Well &#8230;<\/p>\n<blockquote><p>\nToday\n<\/p><\/blockquote>\n<p> &#8230; excellent try!   But no, not quite.  The answer is &#8230;<\/p>\n<blockquote><p>\nTomorrow\n<\/p><\/blockquote>\n<p>But, five points to Hufflepuff, and we add today&#8217;s voucher for a cup of t<sub>ea<\/sub> <font size=1>(no rushing please)<\/font>!<\/p>\n<p>But, back to business, as far as the encoding issue (of gobbledegook) goes, we mucked around thinking the fault lay with &#8220;meta&#8221; tags, and such, in the parent, until we relooked at the FileReader arrangements we had going back at <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html-----------------------------------------GETME' rel=\"noopener\">a changed<\/a> <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html-----------------------------------------GETME' rel=\"noopener\">client_browsing.htm<\/a> client side HTML and Javascript inhouse helper.  We were always using <a target=\"_blank\" href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/FileReader\/readAsDataURL' rel=\"noopener\">readAsDataURL()<\/a> method for this URL call containing &#8220;straighttext=&#8221; argument pattern, but we found more success starting to use <a target=\"_blank\" href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/FileReader\/readAsText' rel=\"noopener\">readAsText()<\/a> method for HTML and XML data inputs.  Makes sense really!  <font color=blue>Now we go<\/font> &#8230;<\/p>\n<p><code><br \/>\n    blob.push(file.slice(start, stop + 1));<br \/>\n    <font color=blue>if (parent.document.getElementById('txtresultout')) {<br \/>\n    reader[ij].readAsText(blob[ij]);<br \/>\n    } else {<br \/>\n        if (document.URL.indexOf('straighttext=') != -1) {<br \/>\n          if (window.parent) {<br \/>\n             if (parent.document.getElementById('result1') && parent.document.getElementById('result2')) {<br \/>\n    reader[ij].readAsText(blob[ij]);<br \/>\n             } else {<br \/>\n    reader[ij].readAsDataURL(blob[ij]);<br \/>\n             }<br \/>\n          } else {<br \/>\n    reader[ij].readAsDataURL(blob[ij]);<br \/>\n          }<br \/>\n        } else {<\/font><br \/>\n    reader[ij].readAsDataURL(blob[ij]);<br \/>\n        <font color=blue>}<br \/>\n    }<\/font><br \/>\n<\/code><\/p>\n<p> &#8230; <font color=blue>as well as<\/font> &#8230;<\/p>\n<p><code><br \/>\n   reader[ij].onloadend = (function(mfile) {<br \/>\n      return function(evt) {<br \/>\n      var dp='', ds=dssuffix, slideshowparent=false, ssuffix='0', nsuffix='2', blnks=' ', xhsf='', zhsfs=[];<br \/>\n      var tomt='video\/mp4', thext='', ithext=0;<br \/>\n      if (evt.target.readyState == FileReader.DONE) { \/\/ DONE == 2<br \/>\n        <font color=blue>if (document.URL.indexOf('straighttext=') != -1) {<br \/>\n          if (window.parent) {<br \/>\n             if (parent.document.getElementById('result1') && parent.document.getElementById('result2')) {<br \/>\n                if (parent.document.getElementById('result1').innerHTML == '') {<br \/>\n                   parent.document.getElementById('result1').innerHTML=(evt.target.result); \/\/ used to use window.atob and .replace('data:application\/octet-stream;base64,', '')<br \/>\n                } else {<br \/>\n                   parent.document.getElementById('result2').innerHTML=(evt.target.result); \/\/ retest earth_scanner.html<br \/>\n                }<br \/>\n             }<br \/>\n          }<br \/>\n        }<\/font><br \/>\n\/\/ rest of FileReader.DONE code follows<br \/>\n      } };<br \/>\n    })(files[ij]);<br \/>\n<\/code><\/p>\n<p> &#8230; as a solution to this issue, putting a smile to many an <a target=\"_blank\" href='https:\/\/www.google.com\/search?q=smiley+face+emoji&#038;rlz=1C5CHFA_enAU973AU973&#038;oq=smiley+face+emoji&#038;gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIMCAEQABgKGLEDGIAEMgkIAhAAGAoYgAQyCQgDEAAYChiABDIJCAQQABgKGIAEMgkIBRAAGAoYgAQyCQgGEAAYChiABDIJCAcQABgKGIAEMgkICBAAGAoYgAQyCQgJEAAYChiABNIBCDQyMTBqMGo0qAIAsAIB&#038;sourceid=chrome&#038;ie=UTF-8' rel=\"noopener\">emoji<\/a> out there.<\/p>\n<p>And as far as our email or SMS sharing goes, we avoided any need for PHP mail ideas by starting to involve hashtagged versions of the incoming XML or HTML input to the XML Lint validator &#8230;<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\n var ihemail='', ihsms='';<br \/>\n<br \/>\n function dohash(isfort) {<br \/>\n \/\/alert('' + isfort);<br \/>\n   if (!isfort || 8 == 8) {<br \/>\n     var urlis=document.URL.split('?')[0].split('#')[0];<br \/>\n     if (('' + document.getElementById('myform').action).indexOf('#') != -1) {<br \/>\n     \/\/alert('#' + ('' + document.getElementById('myform').action).split('#')[1]);<br \/>\n     document.getElementById('ihid').value='' + ('' + document.getElementById('myform').action).split('#')[1];<br \/>\n     document.getElementById('ihid').name='browsecontents';<br \/>\n     urlis+='?browsecontents=' + encodeURIComponent(('' + document.getElementById('myform').action).split('#')[1]) + '&' + document.getElementById('myhxfile').name + '=' + encodeURIComponent(document.getElementById('myhxfile').value.replace(\/\\#\/g,'')) +  '#' + ('' + document.getElementById('myform').action).split('#')[1] + '&contents=' + encodeURIComponent(document.getElementById('incoming').value);<br \/>\n     } else {<br \/>\n   \/\/alert('bC    = ' + bc);<br \/>\n     urlis+='?' + document.getElementById('myhxfile').name + '=' + encodeURIComponent(document.getElementById('myhxfile').value.replace(\/\\#\/g,'')) +  '#contents=' + encodeURIComponent(document.getElementById('incoming').value);<br \/>\n     }<br \/>\n\/\/alert(urlis);<br \/>\n     if (!window.opener || ('' + document.referrer) == '') {<br \/>\n     \/\/alert('dref=' + document.referrer + ' urlis=' + urlis);<br \/>\n     document.body.style.cursor='progress';<br \/>\n     woois=window.open(urlis, '_blank');<br \/>\n     } \/\/else {<br \/>\n     \/\/alert('top' + document.referrer);<br \/>\n     \/\/}<br \/>\n     if (1 == 1) {<br \/>\n     document.getElementById('myform').target='myif';<br \/>\n     ihsms=document.getElementById('dsms').innerHTML;<br \/>\n     ihemail=document.getElementById('demail').innerHTML;<br \/>\n     document.getElementById('myif').style.position='absolute';<br \/>\n     document.getElementById('myif').style.top='0px';<br \/>\n     document.getElementById('myif').style.left='0px';<br \/>\n     document.getElementById('myif').style.width='100%';<br \/>\n     document.getElementById('myif').style.height='100%';<br \/>\n     document.getElementById('myif').style.zIndex='100';<br \/>\n     document.getElementById('myif').style.display='block';<br \/>\n     return true;<br \/>\n     } else {<br \/>\n     location.href=urlis;<br \/>\n     }<br \/>\n     return isfort; \/\/false;<br \/>\n   }<br \/>\n   \/\/alert(87);<br \/>\n   return true;<br \/>\n }<br \/>\n <br \/>\n function doemail() {<br \/>\n }<br \/>\n <br \/>\n function dosms() {<br \/>\n   if (document.getElementById('asms').href.indexOf('sms:&') != -1) {<br \/>\n     document.getElementById('asms').href=document.getElementById('asms').href.replace('sms:&', 'sms:' + ('' + prompt('Please enter SMS number', '')).replace(\/^null\/g,'') + '&');<br \/>\n     if (document.getElementById('asms').href.indexOf('sms:&') == -1) {<br \/>\n       document.getElementById('asms').click();<br \/>\n     }<br \/>\n   }<br \/>\n }<br \/>\n <br \/>\n function checkmyif(iois) {<br \/>\n  if (iois != null) {<br \/>\n    paconto = (iois.contentWindow || iois.contentDocument);<br \/>\n    if (paconto != null) {<br \/>\n     if (paconto.document) { paconto = paconto.document; }<br \/>\n     if (paconto.body != null && (iois.src.indexOf('?') != -1 || iois.src.indexOf('#') != -1 || ihemail != '')) {<br \/>\n       if (('' + document.referrer) == '') {<br \/>\n         paconto.body.style.cursor='progress';<br \/>\n       }<br \/>\n       if (document.getElementById('demail')) {<br \/>\n       \/\/alert(document.getElementById('demail').innerHTML);<br \/>\n         if (('' + document.referrer) == '') {<br \/>\n           paconto.body.style.cursor='progress';<br \/>\n         }<br \/>\n         if (ihemail != '') {<br \/>\n         paconto.document.getElementById('demail').innerHTML=ihemail;<br \/>\n         } else {<br \/>\n         paconto.document.getElementById('demail').innerHTML=document.getElementById('demail').innerHTML;<br \/>\n         }<br \/>\n         paconto.document.getElementById('demail').style.display='inline-block';<br \/>\n       }<br \/>\n       if (document.getElementById('dsms')) {<br \/>\n         if (ihsms != '') {<br \/>\n         paconto.document.getElementById('demail').innerHTML=ihsms;<br \/>\n         } else {<br \/>\n         paconto.document.getElementById('dsms').innerHTML=document.getElementById('dsms').innerHTML;<br \/>\n         }<br \/>\n         paconto.document.getElementById('dsms').style.display='inline-block';<br \/>\n       }<br \/>\n     }<br \/>\n    }<br \/>\n  }<br \/>\n }<br \/>\n <br \/>\n function maybeshow() {<br \/>\n   if (document.getElementById('incoming').value != '') {<br \/>\n      var wwoo=window.open('','_blank','top=50,left=50,width=900,height=900');<br \/>\n      if (document.getElementById('myhxfile').value != '') {<br \/>\n      wwoo.document.write('&lt;html&gt;&lt;head&gt;&lt;meta http-equiv=\"Content-Type\" content=\"text\/html; charset=UTF-8\"&gt;&lt;title&gt;' + document.getElementById('myhxfile').value + '&lt;\/title&gt;&lt;\/head&gt;&lt;body&gt;&lt;textarea style=width:100%;height:100%;&gt;' + document.getElementById('incoming').value + '&lt;\/textarea&gt;&lt;\/body&gt;&lt;\/html&gt;');<br \/>\n      } else if (document.getElementById('myhxfile').placeholder.indexOf('Please ') == -1) {<br \/>\n      wwoo.document.write('&lt;html&gt;&lt;head&gt;&lt;meta http-equiv=\"Content-Type\" content=\"text\/html; charset=UTF-8\"&gt;&lt;title&gt;' + document.getElementById('myhxfile').placeholder + '&lt;\/title&gt;&lt;\/head&gt;&lt;body&gt;&lt;textarea style=width:100%;height:100%;&gt;' + document.getElementById('incoming').value + '&lt;\/textarea&gt;&lt;\/body&gt;&lt;\/html&gt;');<br \/>\n      } else {<br \/>\n      wwoo.document.write('&lt;html&gt;&lt;head&gt;&lt;meta http-equiv=\"Content-Type\" content=\"text\/html; charset=UTF-8\"&gt;&lt;title&gt;XML Lint Validation incoming XML or HTML&lt;\/title&gt;&lt;\/head&gt;&lt;body&gt;&lt;textarea style=width:100%;height:100%;&gt;' + document.getElementById('incoming').value + '&lt;\/textarea&gt;&lt;\/body&gt;&lt;\/html&gt;');<br \/>\n      }<br \/>\n   }<br \/>\n }<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<\/p>\n<p> &#8230; called into play via &#8220;a wrapped&#8221; HTML form onsubmit event <font color=blue>call change<\/font> &#8230;<\/p>\n<p>&lt;?php<br \/>\n<code><br \/>\n&lt;form accept-charset=\"UTF-8\" onsubmit=\" if (document.getElementById('myhxfile').value == '') { document.getElementById('myhxfile').name='xx';  }  return <font color=blue>dohash(<\/font>true<font color=blue>)<\/font>;\" action=.\/xmllint_validation.php&lt;?php echo $bc; ?&gt; id=myform method=POST target=_self&gt;<br \/>\n<\/code><br \/>\n?&gt;<\/p>\n<p> &#8230; in <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php----GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php----GETME\" rel=\"noopener\">&#8220;fifth draft&#8221;<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php_GETME\" rel=\"noopener\">xmllint_validation.php<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php\" rel=\"noopener\">you might want to try for yourself<\/a>.<\/p>\n<p>Happy sharing!<\/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\/xml-lint-validation-shared-encoding-tutorial\/' rel=\"noopener\">XML Lint Validation Shared Encoding Tutorial<\/a>.<\/p-->\n<hr>\n<p id='xmllvsct'>Previous relevant <a target=\"_blank\" title='XML Lint Validation SelectionChange Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/xml-lint-validation-selectionchange-tutorial\/' rel=\"noopener\">XML Lint Validation SelectionChange 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\/xmllint_validation.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"XML Lint Validation SelectionChange Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation_colour_coded_linear_gradient_background_via_rhs.jpg\" title=\"XML Lint Validation SelectionChange Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">XML Lint Validation SelectionChange Tutorial<\/p><\/div>\n<p>Onto yesterday&#8217;s <a title='XML Lint Validation Onclick Tutorial' href='#xmllvot'>XML Lint Validation Onclick Tutorial<\/a>&#8216;s &#8230;<\/p>\n<ul>\n<li>left hand cell hosted pair of textarea element <i>onclick<\/i> (and <i>ondblclick<\/i>) event logics &#8230; today we think a user could benefit from &#8230;<\/li>\n<li>right hand cell hosted textarea element <i>SelectionChange<\/i> <font size=1>(keyboard related)<\/font> event triggered via the user highlighting that textarea text (containing errors) of interest<\/li>\n<\/ul>\n<p> &#8230; via &#8230;<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\n var thesel='', reng='';<br \/>\n<br \/>\n function prereverseengineer() {<br \/>\n   var wasreng=reng;<br \/>\n   reng='';<br \/>\n   reverseengineer(wasreng);<br \/>\n }<br \/>\n<br \/>\n function reverseengineer(what) {<br \/>\n       var oury2=0, nexty2=0;<br \/>\n       var theheight=eval(eval('' + s2rect.height) \/ rowseq);<br \/>\n       var codelines=s2.value.split(String.fromCharCode(10));<br \/>\n       var errdetail='', ierr=0, linenum=0, nums=[];<br \/>\n       thergb=redrgb;<br \/>\n       var bimg='linear-gradient(to bottom, white, '; \/\/ ' white ' + y2 + 'px, ' + thergb + ' ' + y2 + 'px, ' + thergb + ' ' + eval(y2 + eval('' + s1rect.height) \/ rowseq) + 'px,  white ' + eval(y1 + eval('' + s1rect.height) \/ rowseq) + 'px, white)';<br \/>\n       var suff=', white)';<br \/>\n<br \/>\n       if (what.trim() != '') {<br \/>\n         nums=what.split(',');<br \/>\n       }<br \/>\n       if (eval('' + nums.length) &gt; 0) {<br \/>\n         window.scrollTo(0,0);<br \/>\n         s1.title='' + nums[0]; \/\/ + linenum;<br \/>\n         s2.title='' + codelines[eval(-1 + eval('' + nums[0]))];<br \/>\n         \/\/alert(what);<br \/>\n         oury2=eval(eval(-1 + eval('' + nums[0])) * theheight);<br \/>\n         bimg+=' white ' + oury2 + 'px, ' + thergb + ' ' + oury2 + 'px, ' + thergb + ' ' + eval(oury2 + eval('' + s1rect.height) \/ rowseq) + 'px, white ' + eval(oury2 + eval('' + s1rect.height) \/ rowseq) + 'px, ';<br \/>\n         for (ierr=1; ierr&lt;nums.length; ierr++) {<br \/>\n         oury2=eval(eval(-1 + eval('' + nums[ierr])) * theheight);<br \/>\n         \/\/bimg+=thergb + ' ' + eval(oury2 + eval('' + s1rect.height) \/ rowseq) + 'px, white ' + oury2 + 'px, ' + thergb + ' ' + oury2 + 'px, '; \/\/ + thergb + ' ' + eval(oury2 + eval('' + s1rect.height) \/ rowseq) + 'px, ';<br \/>\n         bimg+=' white ' + oury2 + 'px, ' + thergb + ' ' + oury2 + 'px, ' + thergb + ' ' + eval(oury2 + eval('' + s1rect.height) \/ rowseq) + 'px, white ' + eval(oury2 + eval('' + s1rect.height) \/ rowseq) + 'px, ';<br \/>\n         s1.title+=String.fromCharCode(10) + '' + nums[ierr]; \/\/ + linenum;<br \/>\n         s2.title+=String.fromCharCode(10) + '' + codelines[eval(-1 + eval('' + nums[ierr]))];<br \/>\n         }<br \/>\n         if (bimg.indexOf(suff) == -1) { bimg+=suff.substring(1); }<br \/>\n         s1.style.backgroundImage='' + bimg;<br \/>\n         s2.style.backgroundImage='' + bimg;<br \/>\n         document.getElementById('outgoing').title='Highlighted to left are codelines ' + what + ' with errors';<br \/>\n       }<br \/>\n }<br \/>\n<br \/>\n function decorateleft() {<br \/>\n       var jerr=0;<br \/>\n       reng=''<br \/>\n       if (ourdelim == ':') {<br \/>\n         for (jerr=1; jerr&lt;ourfindsare.length; jerr++) {<br \/>\n           if (ourfindsare[jerr].trim() != '') {<br \/>\n             if (ourfindsare[jerr].substring(0,1) &gt;= '0' && ourfindsare[jerr].substring(0,1) &lt;= '9') {<br \/>\n              if (ourfindsare[jerr].slice(-1) &gt;= '0' && ourfindsare[jerr].slice(-1) &lt;= '9') {<br \/>\n               if ((',' + reng + ',').indexOf(',' + ourfindsare[jerr].split(':')[0] + ',') == -1) {<br \/>\n               if (reng == '') { reng=ourfindsare[jerr]; } else {  reng+=',' + ourfindsare[jerr]; }<br \/>\n               }<br \/>\n              }<br \/>\n             }<br \/>\n           }<br \/>\n         }<br \/>\n       } else if (ourdelim.trim() != '') {<br \/>\n         for (jerr=1; jerr&lt;ourfindsare.length; jerr++) {<br \/>\n           if (ourfindsare[jerr].split(':')[0].trim() != '') {<br \/>\n             if (ourfindsare[jerr].split(':')[0].substring(0,1) &gt;= '0' && ourfindsare[jerr].split(':')[0].substring(0,1) &lt;= '9') {<br \/>\n              if (ourfindsare[jerr].split(':')[0].slice(-1) &gt;= '0' && ourfindsare[jerr].split(':')[0].slice(-1) &lt;= '9') {<br \/>\n               if ((',' + reng + ',').indexOf(',' + ourfindsare[jerr].split(':')[0] + ',') == -1) {<br \/>\n               if (reng == '') { reng=ourfindsare[jerr].split(':')[0]; } else {  reng+=',' + ourfindsare[jerr].split(':')[0]; }<br \/>\n               }<br \/>\n              }<br \/>\n             }<br \/>\n           }<br \/>\n         }<br \/>\n       }<br \/>\n       if (reng != '') {<br \/>\n       setTimeout(prereverseengineer, 9000); \/\/ reverseengineer(reng);<br \/>\n       }<br \/>\n }<br \/>\n<br \/>\n function handleSelection() { \/\/ thanks to <a target=\"_blank\" title='https:\/\/stackoverflow.com\/questions\/46651479\/reacting-to-selection-changes-in-an-html-textarea' href='https:\/\/stackoverflow.com\/questions\/46651479\/reacting-to-selection-changes-in-an-html-textarea' rel=\"noopener\">https:\/\/stackoverflow.com\/questions\/46651479\/reacting-to-selection-changes-in-an-html-textarea<\/a><br \/>\n  const activeElement = document.activeElement;<br \/>\n<br \/>\n  \/\/ Make sure this is your textarea<br \/>\n  \/\/document.title=(('' + activeElement.id) + activeElement.outerHTML.substring(0,23));<br \/>\n  if (activeElement && activeElement.outerHTML.indexOf('&lt;textarea') == 0 && ('' + activeElement.id) == 'outgoing') {<br \/>\n    const range = {<br \/>\n      start: activeElement.selectionStart,<br \/>\n      end: activeElement.selectionEnd<br \/>\n    };<br \/>\n    ourdelim=':';<br \/>\n    ourfindsare=[];<br \/>\n    thesel='';<br \/>\n    \/\/ Do something with your range<br \/>\n    if (eval('' + range.end) &gt; eval('' + range.start)) {<br \/>\n      thesel=(activeElement.value.substring(range.start).substring(0, eval(eval('' + range.end) - eval('' + range.start) )));<br \/>\n      if (thesel.trim() != '' && thesel.indexOf(':') != -1) {<br \/>\n      var floc=thesel.split(':')[0];<br \/>\n      if (tfis != '') {<br \/>\n        if (eval('' + floc.length) &gt;= eval('' + tfis.length)) {<br \/>\n          ourdelim=tfis + ':';<br \/>\n          ourfindsare=thesel.split(ourdelim);<br \/>\n        } else {<br \/>\n          thesel=thesel.replace(':', tfis + ':');<br \/>\n          ourdelim=tfis + ':';<br \/>\n          ourfindsare=thesel.split(ourdelim);<br \/>\n        }<br \/>\n      } else {<br \/>\n          ourfindsare=thesel.split(ourdelim);<br \/>\n      }<br \/>\n      decorateleft();<br \/>\n      }<br \/>\n    }<br \/>\n  }<br \/>\n }<br \/>\n<br \/>\n document.addEventListener('selectionchange', handleSelection);<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<\/p>\n<p> &#8230; in <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php---GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php---GETME\" rel=\"noopener\">&#8220;fourth draft&#8221;<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php_GETME\" rel=\"noopener\">xmllint_validation.php<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php\" rel=\"noopener\">you might want to try for yourself<\/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-xml-lint-validation-selectionchange-tutorial\/' rel=\"noopener\">XML Lint Validation SelectionChange Tutorial<\/a>.<\/p-->\n<hr>\n<p id='xmllvot'>Previous relevant <a target=\"_blank\" title='XML Lint Validation Onclick Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/xml-lint-validation-onclick-tutorial\/' rel=\"noopener\">XML Lint Validation 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\/xmllint_validation.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"XML Lint Validation Onclick Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation_colour_coded_linear_gradient_background.jpg\" title=\"XML Lint Validation Onclick Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">XML Lint Validation Onclick Tutorial<\/p><\/div>\n<p>Onto yesterday&#8217;s <a title='XML Lint Validation Browsing Tutorial' href='#xmllvbt'>XML Lint Validation Browsing Tutorial<\/a> XML Lint Validation web application progress, today, we start to add some onclick and ondblclick event logic to those left hand table cell pair of textarea elements &#8230;<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\nfunction gcbr() {<br \/>\n  if (rowseq != '') {<br \/>\n   s1rect=s1.getBoundingClientRect();<br \/>\n   s1.onclick=function(event) { s1click(event);  };<br \/>\n   s1.ondblclick=function(event) { alert('Line ' + s1.title + s1.getAttribute('data-status') + ':' + String.fromCharCode(10) + s2.title);  };<br \/>\n   s2rect=s2.getBoundingClientRect();<br \/>\n   s2.onclick=function(event) { s2click(event);  };<br \/>\n   s2.ondblclick=function(event) { alert('Line ' + s1.title + s1.getAttribute('data-status') + ':' + String.fromCharCode(10) + s2.title);  };<br \/>\n  }<br \/>\n  <br \/>\n  if (('' + location.hash).replace(\/^null\/g,'').replace(\/^undefined\/g,'').trim() != '') {<br \/>\n   if (document.getElementById('myhxfile').value == '') {<br \/>\n     document.getElementById('myhxfile').placeholder=decodeURIComponent(('' + location.hash).replace(\/^\\#\/g,''));<br \/>\n     var tf=document.getElementById('outgoing').value;<br \/>\n     var tfis=tf.split(':')[0];<br \/>\n     if (tfis.trim() != '') {<br \/>\n       while (tf.indexOf(tfis + ':') != -1) {<br \/>\n         tf=tf.replace(tfis + ':', decodeURIComponent(('' + location.hash).replace(\/^\\#\/g,'')) + ':');<br \/>\n       }<br \/>\n       document.getElementById('outgoing').value=tf;<br \/>\n     }<br \/>\n   }<br \/>\n  }<br \/>\n}<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<\/p>\n<p> &#8230; and though we usually do not associate onclick logic with textarea elements, today we&#8217;re preferring that to any alternate use of div element alternative because, today, for the first time, we&#8217;re making use of the <i>\u201csharp\u201d colour stops<\/i> mentioned by <a target=\"_blank\" href=\"https:\/\/tympanus.net\/codrops\/css_reference\/linear-gradient\/\" rel=\"noopener\">linear-gradient()<\/a>, thanks &#8230;<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\nfunction s1click(e) {<br \/>\n       var theheight=eval(eval('' + s1rect.height) \/ rowseq);<br \/>\n       var codelines=s2.value.split(String.fromCharCode(10));<br \/>\n       var errdetail='', ierr=0, linenum=0;<br \/>\n       if (e.touches) {<br \/>\n       if (e.touches[0].pageX) {<br \/>\n       x1=(eval(e.touches[0].pageX + document.body.scrollLeft * 1) * 1);<br \/>\n       y1=(eval(e.touches[0].pageY + eval(eval(e.touches[0].pageY % theheight) - theheight) + document.body.scrollTop * 1) * 1);<br \/>\n       linenum=Math.floor(eval(1 + eval(eval(e.touches[0].pageY + document.body.scrollTop - s1rect.top) \/ theheight)));<br \/>\n       } else {<br \/>\n       x1=(eval(e.touches[0].clientX + document.body.scrollLeft * 1) * 1);<br \/>\n       y1=(eval(e.touches[0].clientY + eval(eval(e.touches[0].clientY % theheight) - theheight) + document.body.scrollTop * 1) * 1);<br \/>\n       linenum=Math.floor(eval(1 + eval(eval(e.touches[0].clientY + document.body.scrollTop - s1rect.top) \/ theheight)));<br \/>\n       }<br \/>\n       } else if (e.clientX || e.clientY) {<br \/>\n        x1=(e.clientX + document.body.scrollLeft * 1);<br \/>\n        y1=(e.clientY + eval(eval(e.clientY % theheight) - theheight) + document.body.scrollTop * 1);<br \/>\n        linenum=Math.floor(eval(1 + eval(eval(e.clientY + document.body.scrollTop - s1rect.top) \/ theheight)));<br \/>\n       } else {<br \/>\n        x1=(e.pageX + document.body.scrollLeft * 1);<br \/>\n        y1=(e.pageY + eval(eval(e.pageY % theheight) - theheight) + document.body.scrollTop * 1);<br \/>\n        linenum=Math.floor(eval(1 + eval(eval(e.pageY + document.body.scrollTop - s1rect.top) \/ theheight)));<br \/>\n       }<br \/>\n       \/\/alert('' + linenum + ' ' + y1 + '\/' + document.body.scrollTop + ' ... ' + s1.scrollTop + ' ... ' + s1rect.top + '\/' + s1rect.y + ' +++ ' + theheight);<br \/>\n       var finds=document.getElementById('outgoing').value.split(':' + linenum + ':');<br \/>\n       thergb=greenrgb;<br \/>\n       s1.setAttribute('data-status', '');<br \/>\n       if (eval('' + finds.length) &gt; 1) {<br \/>\n       for (ierr=1; ierr&lt;finds.length; ierr++) {<br \/>\n         errdetail+=String.fromCharCode(10) + finds[eval(-1 + ierr)].split(':' + linenum + ':')[0].split(String.fromCharCode(10))[eval(-1 + finds[eval(-1 + ierr)].split(':' + linenum + ':')[0].split(String.fromCharCode(10)).length)] + ':' + linenum + ':' + finds[eval(0 + ierr)].split(String.fromCharCode(10))[0];<br \/>\n       }<br \/>\n       errdetail+=String.fromCharCode(10);<br \/>\n       thergb=redrgb;<br \/>\n       s1.setAttribute('data-status', ' (has errors ... ' + errdetail + ' ... over to the right)');<br \/>\n       }<br \/>\n       s1.title='' + linenum;<br \/>\n       s2.title='' + codelines[eval(-1 + linenum)];<br \/>\n       y1-=eval('' + s1rect.top);<br \/>\n       \/\/ linear-gradient(to right, yellow, yellow 20%, #009966 20%, #009966 80%, purple 80%, purple);<br \/>\n       \/\/alert('linear-gradient(to bottom, white, white ' + y1 + 'px, ' + thergb + ' ' + y1 + 'px, ' + thergb + ' ' + eval(y1 + eval('' + s2rect.height) \/ rowseq) + 'px,  white ' + eval(y1 + eval('' + s2rect.height) \/ rowseq) + 'px, white)');<br \/>\n       s2.style.backgroundImage='linear-gradient(to bottom, white, white ' + y1 + 'px, ' + thergb + ' ' + y1 + 'px, ' + thergb + ' ' + eval(y1 + eval('' + s2rect.height) \/ rowseq) + 'px,  white ' + eval(y1 + eval('' + s2rect.height) \/ rowseq) + 'px, white)';<br \/>\n       s1.style.backgroundImage='linear-gradient(to bottom, white, white ' + y1 + 'px, ' + thergb + ' ' + y1 + 'px, ' + thergb + ' ' + eval(y1 + eval('' + s2rect.height) \/ rowseq) + 'px,  white ' + eval(y1 + eval('' + s2rect.height) \/ rowseq) + 'px, white)';<br \/>\n}<br \/>\n<br \/>\nfunction s2click(e) {<br \/>\n       var theheight=eval(eval('' + s2rect.height) \/ rowseq);<br \/>\n       var codelines=s2.value.split(String.fromCharCode(10));<br \/>\n       var errdetail='', ierr=0, linenum=0;<br \/>\n       if (e.touches) {<br \/>\n       if (e.touches[0].pageX) {<br \/>\n       x2=(eval(e.touches[0].pageX + document.body.scrollLeft * 1) * 1);<br \/>\n       y2=(eval(e.touches[0].pageY + eval(eval(e.touches[0].pageY % theheight) - theheight) + document.body.scrollTop * 1) * 1);<br \/>\n       linenum=Math.floor(eval(1 + eval(eval(e.touches[0].pageY + document.body.scrollTop - s2rect.top) \/ theheight)));<br \/>\n       } else {<br \/>\n       x2=(eval(e.touches[0].clientX + document.body.scrollLeft * 1) * 1);<br \/>\n       y2=(eval(e.touches[0].clientY + eval(eval(e.touches[0].clientY % theheight) - theheight) + document.body.scrollTop * 1) * 1);<br \/>\n       linenum=Math.floor(eval(1 + eval(eval(e.touches[0].clientY + document.body.scrollTop - s2rect.top) \/ theheight)));<br \/>\n       }<br \/>\n       } else if (e.clientX || e.clientY) {<br \/>\n        x2=(e.clientX + document.body.scrollLeft * 1);<br \/>\n        y2=(e.clientY + eval(eval(e.clientY % theheight) - theheight) + document.body.scrollTop * 1);<br \/>\n        linenum=Math.floor(eval(1 + eval(eval(e.clientY + document.body.scrollTop - s2rect.top) \/ theheight)));<br \/>\n       } else {<br \/>\n        x2=(e.pageX + document.body.scrollLeft * 1);<br \/>\n        y2=(e.pageY + eval(eval(e.pageY % theheight) - theheight) + document.body.scrollTop * 1);<br \/>\n        linenum=Math.floor(eval(1 + eval(eval(e.pageY + document.body.scrollTop - s2rect.top) \/ theheight)));<br \/>\n       }<br \/>\n       var finds=document.getElementById('outgoing').value.split(':' + linenum + ':');<br \/>\n       thergb=greenrgb;<br \/>\n       s1.setAttribute('data-status', '');<br \/>\n       if (eval('' + finds.length) &gt; 1) {<br \/>\n       for (ierr=1; ierr&lt;finds.length; ierr++) {<br \/>\n         errdetail+=String.fromCharCode(10) + finds[eval(-1 + ierr)].split(':' + linenum + ':')[0].split(String.fromCharCode(10))[eval(-1 + finds[eval(-1 + ierr)].split(':' + linenum + ':')[0].split(String.fromCharCode(10)).length)] + ':' + linenum + ':' + finds[eval(0 + ierr)].split(String.fromCharCode(10))[0];<br \/>\n       }<br \/>\n       errdetail+=String.fromCharCode(10);<br \/>\n       thergb=redrgb;<br \/>\n       s1.setAttribute('data-status', ' (has errors ... ' + errdetail + ' ... over to the right)');<br \/>\n       }<br \/>\n       s1.title='' + linenum;<br \/>\n       s2.title='' + codelines[eval(-1 + linenum)];<br \/>\n       y2-=eval('' + s2rect.top);<br \/>\n       s2.style.backgroundImage='linear-gradient(to bottom, white, white ' + y2 + 'px, ' + thergb + ' ' + y2 + 'px, ' + thergb + ' ' + eval(y2 + eval('' + s1rect.height) \/ rowseq) + 'px,  white ' + eval(y1 + eval('' + s1rect.height) \/ rowseq) + 'px, white)';<br \/>\n       s1.style.backgroundImage='linear-gradient(to bottom, white, white ' + y2 + 'px, ' + thergb + ' ' + y2 + 'px, ' + thergb + ' ' + eval(y2 + eval('' + s1rect.height) \/ rowseq) + 'px,  white ' + eval(y1 + eval('' + s1rect.height) \/ rowseq) + 'px, white)';<br \/>\n}<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<\/p>\n<p> to be able to add colour coding to (the background of) HTML textarea elements.<\/p>\n<p>Also, a hashtagging idea is implemented to aid with bringing over a browsed for file name into the &#8220;reporting mix&#8221; in <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php--GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php--GETME\" rel=\"noopener\">&#8220;third draft&#8221;<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php_GETME\" rel=\"noopener\">xmllint_validation.php<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php\" rel=\"noopener\">you might want to try for yourself<\/a>.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" Lint Validation Onclick rel=\"noopener\">..<\/p-->\n<hr>\n<p id='xmllvbt'>Previous relevant <a target=\"_blank\" title='XML Lint Validation Browsing Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/xml-lint-validation-browsing-tutorial\/' rel=\"noopener\">XML Lint Validation Browsing 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\/xmllint_validation.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"XML Lint Validation Browsing Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation_browse.jpg\" title=\"XML Lint Validation Browsing Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">XML Lint Validation Browsing Tutorial<\/p><\/div>\n<p>Yesterday&#8217;s <a title='XML Lint Validation Tutorial' href='#xmllvt'>XML Lint Validation Tutorial<\/a> had us starting out on a discovery tour of XML Lint, yesterday &#8230;<\/p>\n<ul>\n<li>starting with an HTML or XML URL of interest incoming data way &#8230; and today, we add onto that &#8230;<\/li>\n<li>a local HTML or XMLfile browsing means of defining your input data into &#8230;<\/li>\n<\/ul>\n<p> &#8230; <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php-GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php-GETME\" rel=\"noopener\">&#8220;second draft&#8221;<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php_GETME\" rel=\"noopener\">xmllint_validation.php<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php\" rel=\"noopener\">you might want to try for yourself<\/a>, helped out by <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html----------------------------------------GETME' rel=\"noopener\">a tweaked<\/a> <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html----------------------------------------GETME' rel=\"noopener\">client_browsing.htm<\/a> client side HTML and Javascript inhouse helper.<\/p>\n<p>Again, we see, into another way to yesterday&#8217;s work, how useful is a textarea element, in that it can facilitate the way &#8230;<\/p>\n<ul>\n<li>HTML and XML data can be input via populating the textarea innerHTML attribute &#8230; which flows through to a &#8230;<\/li>\n<li>textarea value attribute value where any &lt; is mapped to &amp;lt; and &gt; is mapped to &amp;gt; &#8230; ready for &#8230;<\/li>\n<li>an HTML form hosted textarea, given a filled in <i>name<\/i> attribute be able to share this data to that form&#8217;s <i>action<\/i> attributed value &#8230;<br \/>\n&lt;?php<br \/>\n<code><br \/>\nfunction ronecheck() {<br \/>\n   if (document.getElementById('result1').innerHTML != '') {<br \/>\n      document.getElementById('incoming').innerHTML=document.getElementById('result1').value;<br \/>\n      document.getElementById('result1').innerHTML='';<br \/>\n      document.getElementById('result1').value='';<br \/>\n      document.getElementById('myhxfile').name='xx';<br \/>\n      document.getElementById('mysub').click();<br \/>\n   }<br \/>\n}<br \/>\n<\/code><br \/>\n?&gt;<br \/>\n &#8230; (in our case being the same PHP) &#8230;<\/li>\n<li>able to be processed by recall PHP interventional code &#8230;<br \/>\n&lt;?php<br \/>\n<code><br \/>\n $vsnone='none';<br \/>\n $prefn='Please enter either HTML or XML file to validate ...';<br \/>\n $pth='';<br \/>\n $rn='' .rand(1,78477554);<br \/>\n $results='';<br \/>\n $precontents='';<br \/>\n $contents='';<br \/>\n $fn='';<br \/>\n if (!isset($_GET['htmlfile']) && isset($_GET['content'])) {<br \/>\n   $_GET['htmlfile']=$_GET['content'];<br \/>\n }<br \/>\n if (!isset($_POST['htmlfile']) && isset($_POST['content'])) {<br \/>\n   $_POST['htmlfile']=$_POST['content'];<br \/>\n }<br \/>\n if (isset($_GET['htmlfile'])) {<br \/>\n   if (substr(trim(urldecode($_GET['htmlfile'])) . ' ', 0, 1) == '&lt;') {<br \/>\n   $contents=trim(str_replace('+',' ',urldecode($_GET['htmlfile'])));<br \/>\n   if (strpos(strtolower(explode('&gt;', $contents)[0]), 'html') !== false) {<br \/>\n   $fn='\/tmp\/html_' . $rn . '.html';<br \/>\n   } else if (strpos(strtolower(explode('&gt;', $contents)[0]), 'xml') !== false) {<br \/>\n   $fn='\/tmp\/xml_' . $rn . '.xml';<br \/>\n   }<br \/>\n   file_put_contents($fn, $contents);<br \/>\n   } else {<br \/>\n   $fn=str_replace('+',' ',urldecode($_GET['htmlfile']));<br \/>\n   }<br \/>\n   if ($fn != '') {<br \/>\n   if (strpos($fn, 'localhost') !== false) {<br \/>\n     $rhs=explode('localhost' . explode('\/', explode('localhost', $fn)[1])[0], $fn)[1];<br \/>\n     $fn=$_SERVER['DOCUMENT_ROOT'] . $rhs;<br \/>\n     $pth='\/usr\/bin\/';<br \/>\n   } else if (strpos($fn, 'rjmprogramming.com.au') !== false) {<br \/>\n     $rhs=explode('rjmprogramming.com.au' . explode('\/', explode('rjmprogramming.com.au', $fn)[1])[0], $fn)[1];<br \/>\n     $fn=$_SERVER['DOCUMENT_ROOT'] . $rhs;<br \/>\n   } else if (strpos($_SERVER['SERVER_NAME'], 'localhost') !== false) {<br \/>\n     $pth='\/usr\/bin\/';<br \/>\n   }<br \/>\n   }<br \/>\n   if (file_exists($fn)) {<br \/>\n   if ($contents == '') {<br \/>\n     $contents=file_get_contents($fn);<br \/>\n   }<br \/>\n   $prefn=$fn;<br \/>\n   $fn=realpath($fn);<br \/>\n if (strpos(strtolower($fn), '.xml') !== false) {<br \/>\n   $vsnone='block';<br \/>\n   $results=shell_exec($pth . 'xmllint --valid --noout ' . $fn . ' 2&gt; ' . ' ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   if (file_exists(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err')) {<br \/>\n     $results.=\"\\n\";<br \/>\n     $results.=file_get_contents(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n     unlink(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   }<br \/>\n } else if (strpos(strtolower($fn), '.htm') !== false) {<br \/>\n   $vsnone='block';<br \/>\n   $results=shell_exec($pth . 'xmllint --html --valid --noout ' . $fn . ' 2&gt; ' . ' ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   if (file_exists(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err')) {<br \/>\n     $results.=\"\\n\";<br \/>\n     $results.=file_get_contents(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n     unlink(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   }<br \/>\n }<br \/>\n   if (strpos($fn, '\/tmp\/') !== false) { unlink($fn);  }<br \/>\n   } else {<br \/>\n   $contents='';<br \/>\n   if (strpos($fn, '\/tmp\/') !== false) { unlink($fn);  }<br \/>\n   }<br \/>\n } else if (isset($_POST['htmlfile'])) {<br \/>\n   if (substr(trim(urldecode($_POST['htmlfile'])) . ' ', 0, 1) == '&lt;') {<br \/>\n   $contents=trim(str_replace('+',' ',urldecode($_POST['htmlfile'])));<br \/>\n   if (strpos(strtolower(explode('&gt;', $contents)[0]), 'html') !== false) {<br \/>\n   $fn='\/tmp\/html_' . $rn . '.html';<br \/>\n   } else if (strpos(strtolower(explode('&gt;', $contents)[0]), 'xml') !== false) {<br \/>\n   $fn='\/tmp\/xml_' . $rn . '.xml';<br \/>\n   }<br \/>\n   file_put_contents($fn, $contents);<br \/>\n   } else {<br \/>\n   $fn=str_replace('+',' ',urldecode($_POST['htmlfile']));<br \/>\n   }<br \/>\n   if ($fn != '') {<br \/>\n   if (strpos($fn, 'localhost') !== false) {<br \/>\n     $rhs=explode('localhost' . explode('\/', explode('localhost', $fn)[1])[0], $fn)[1];<br \/>\n     $fn=$_SERVER['DOCUMENT_ROOT'] . $rhs;<br \/>\n     $pth='\/usr\/bin\/';<br \/>\n   } else if (strpos($fn, 'rjmprogramming.com.au') !== false) {<br \/>\n     $rhs=explode('rjmprogramming.com.au' . explode('\/', explode('rjmprogramming.com.au', $fn)[1])[0], $fn)[1];<br \/>\n     $fn=$_SERVER['DOCUMENT_ROOT'] . $rhs;<br \/>\n   } else if (strpos($_SERVER['SERVER_NAME'], 'localhost') !== false) {<br \/>\n     $pth='\/usr\/bin\/';<br \/>\n   }<br \/>\n   }<br \/>\n   if (file_exists($fn)) {<br \/>\n   $prefn=$fn;<br \/>\n   if ($contents == '') {<br \/>\n     $contents=file_get_contents($fn);<br \/>\n   }<br \/>\n   $fn=realpath($fn);<br \/>\n if (strpos(strtolower($fn), '.xml') !== false) {<br \/>\n   $vsnone='block';<br \/>\n   $results=shell_exec($pth . 'xmllint --valid --noout ' . $fn . ' 2&gt; ' . ' ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   if (file_exists(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err')) {<br \/>\n     $results.=\"\\n\";<br \/>\n     $results.=file_get_contents(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n     unlink(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   }<br \/>\n } else if (strpos(strtolower($fn), '.htm') !== false) {<br \/>\n   $vsnone='block';<br \/>\n   $results=shell_exec($pth . 'xmllint --html --valid --noout ' . $fn . ' 2&gt; ' . ' ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   if (file_exists(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err')) {<br \/>\n     $results.=\"\\n\";<br \/>\n     $results.=file_get_contents(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n     \/\/file_put_contents('xxx.xxx', $results);<br \/>\n     unlink(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   }<br \/>\n }<br \/>\n   if (strpos($fn, '\/tmp\/') !== false) { unlink($fn);  }<br \/>\n   } else {<br \/>\n   $contents='';<br \/>\n   if (strpos($fn, '\/tmp\/') !== false) { unlink($fn);  }<br \/>\n   }<br \/>\n }<br \/>\n if ($contents != '') {<br \/>\n   $lines=explode(\"\\n\", $contents);<br \/>\n   for ($ii=1; $ii&lt;=sizeof($lines); $ii++) {<br \/>\n     $precontents.='' . $ii . \"\\n\";<br \/>\n   }<br \/>\n }<br \/>\n<\/code><br \/>\n?&gt;\n<\/ul>\n<p>Cute, huh?!<\/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-xml-lint-validation-browsing-tutorial\/' rel=\"noopener\">XML Lint Validation Browsing Tutorial<\/a>.<\/p-->\n<hr>\n<p id='xmllvt'>Previous relevant <a target=\"_blank\" title='XML Lint Validation Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/xml-lint-validation-tutorial\/' rel=\"noopener\">XML Lint Validation 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\/xmllint_validation.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"XML Lint Validation Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.jpg\" title=\"XML Lint Validation Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">XML Lint Validation Tutorial<\/p><\/div>\n<p>Do you remember when we discussed the Sanitizer API, talked about at <a title='Sanitizer API Primer Tutorial' href='#sapipt'>Sanitizer API Primer Tutorial<\/a>, regarding it as a web application HTML (and more) validation tool?<\/p>\n<p>Well, we&#8217;ve based a new &#8220;validator&#8221; of HTML or XML using the <a target=\"_blank\" title='xmllint on Linux information' href='https:\/\/linux.die.net\/man\/1\/xmllint' rel=\"noopener\">XML Lint<\/a> web application on what we did then, but this code needing to be &#8230;<\/p>\n<ul>\n<li>under the auspices of a serverside scenario &#8230; ie. PHP &#8230; for us &#8230; calling on &#8230;<\/li>\n<li>underlying operating system call such as (for HTML qsall.htm incoming data file) &#8230;<br \/>\n<code><br \/>\nxmllint --html --valid --noout .\/qsall.htm<br \/>\n<\/code><br \/>\n &#8230; via &#8230;<\/li>\n<li><a target=\"_blank\" title='PHP shell_exec() method information' href='http:\/\/php.net\/manual\/en\/function.shell-exec.php' rel=\"noopener\">shell_exec<\/a><\/li>\n<\/ul>\n<p> &#8230; there&#8217;s not much left of the original HTML and Javascript!<\/p>\n<p>We had a fun time with HTML textarea elements and scrolling with the resultant <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php_GETME\" rel=\"noopener\">&#8220;first draft&#8221;<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php_GETME\" rel=\"noopener\">xmllint_validation.php<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php\" rel=\"noopener\">you might want to try for yourself<\/a> supplying an HTML or XML URL of intetest.  Why, in particular?  Well, it was the first time that we remember trying to make practically useful &#8230;<\/p>\n<ul>\n<li>a table cell (ie. td element) (the left of two) hosted &#8230;<\/li>\n<li>two textarea element arrangement whereby, ideally. they view &#8230;\n<ol>\n<li>side by side<\/li>\n<li>if one is scrolled the two identically scroll the same amount &#8230; <font size=1>(document.body outerHTML)<\/font> HTML &#8230;<br \/>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\n&lt;body onload=\"s1 = document.getElementById('preincoming'); s2 = document.getElementById('incoming'); s1.addEventListener('scroll', select_scroll_1, false); s2.addEventListener('scroll', select_scroll_2, false);\" data-onload='onl();'&gt;<br \/>\n&lt;h1&gt;XML Lint Validation &lt;!--button onclick='trythis();' title='Try your own'&gt;Usage&lt;\/button--&gt;&lt;\/h1&gt;<br \/>\n&lt;h3&gt;RJM Programming - June, 2024&lt;\/h3&gt;<br \/>\n&lt;form action=.\/xmllint_validation.php method=POST target=_self&gt;<br \/>\n&lt;table style=width:95%; border=5&gt;<br \/>\n&lt;tr&gt;&lt;th colspan=2 style=text-align:center;&gt;XML Lint validation of &lt;input style=width:70%; onblur=\"if (this.value.length &gt; 0) { document.getElementById('mysub').click();  }\" name=htmlfile id=myhxfile placeholder='Please enter either HTML or XML file to validate ...' value=\"&lt;?php echo str_replace('&gt;','&gt;',str_replace('&lt;','&lt;',$prefn)); ?&gt;\"&gt;&lt;\/input&gt;&lt;\/th&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;&lt;th&gt;Data to validate&lt;\/th&gt;&lt;th&gt;XML Lint results&lt;\/th&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;&lt;td style=vertical-align:top;&gt;&lt;textarea style=font-size:8px;display:inline-block;overflow-x:clip;text-wrap:nowrap;text-align:right; id=preincoming&gt;&lt;?php echo str_replace('&gt;','&gt;',str_replace('&lt;','&lt;',$precontents)); ?&gt;&lt;\/textarea&gt;&lt;textarea onblur=\"if (this.value.length &gt; 0 && '&lt;?echo $fn; ?&gt;' == '') { document.getElementById('mysub').click();  }\" style=font-size:8px;display:inline-block;overflow-x:clip;text-wrap:nowrap; name=content id=incoming&gt;&lt;?php echo str_replace('&gt;','&gt;',str_replace('&lt;','&lt;',$contents)); ?&gt;&lt;\/textarea&gt;&lt;\/td&gt;&lt;td style=vertical-align:top;&gt;&lt;textarea id=outgoing&gt;&lt;?php echo str_replace('&gt;','&gt;',str_replace('&lt;','&lt;',$results)); ?&gt;&lt;\/textarea&gt;&lt;\/td&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;&lt;td&gt;&lt;\/td&gt;&lt;td&gt;&lt;input type=submit id=mysub style=display:&lt;?php echo $vsnone; ?&gt; value=Validate&gt;&lt;\/input&gt;&lt;\/td&gt;&lt;\/tr&gt;<br \/>\n&lt;\/table&gt;<br \/>\n&lt;\/form&gt;<br \/>\n&lt;\/body&gt;<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<br \/>\n &#8230; uses Javascript &#8230;<br \/>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\nvar s1=null, s2=null;<br \/>\n<br \/>\n\/\/ Thanks to <a target=\"_blank\" href='https:\/\/stackoverflow.com\/questions\/7108270\/scrolling-2-different-elements-in-same-time' title='https:\/\/stackoverflow.com\/questions\/7108270\/scrolling-2-different-elements-in-same-time' rel=\"noopener\">https:\/\/stackoverflow.com\/questions\/7108270\/scrolling-2-different-elements-in-same-time<\/a><br \/>\nfunction select_scroll_1(e) { s2.scrollTop = s1.scrollTop; }<br \/>\nfunction select_scroll_2(e) { s1.scrollTop = s2.scrollTop; }<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<br \/>\n&#8230; so that &#8230;<\/li>\n<li>the left hand textarea contains code line numbers right aligned &#8230; to sidle up next to &#8230;<\/li>\n<li>the right hand textarea contains the code (HTML or XML) being validated by xmllint<\/li>\n<\/ol>\n<p> &#8230; while &#8230;\n<\/li>\n<li>the right hand table cell contains the xmllint validation (of HTML or XML) results<\/li>\n<\/ul>\n<p> &#8230; had us, in practice, thanking our lucky stars that &#8230;<\/p>\n<ol>\n<li>textarea elements are resizeable<\/li>\n<li>you can simulate &#8220;some cockpit action&#8221; aligning them vertically &#8230; <a target=\"_blank\" title='?' href='https:\/\/www.youtube.com\/watch?v=0TiqXFssKMY' rel=\"noopener\">Jim<\/a>?!<\/li>\n<\/ol>\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\/xml-lint-validation-tutorial\/' rel=\"noopener\">XML Lint Validation Tutorial<\/a>.<\/p-->\n<hr>\n<p id='sapipt'>Previous relevant <a target=\"_blank\" title='Sanitizer API Primer Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/sanitizer-api-primer-tutorial\/' rel=\"noopener\">Sanitizer API Primer Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/sanitizer_api_test.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Sanitizer API Primer Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/sanitizer_api_test.jpg\" title=\"Sanitizer API Primer Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Sanitizer API Primer Tutorial<\/p><\/div>\n<p>Today we&#8217;re roadtesting the <a target=\"_blank\" title='Sanitizer API' href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/HTML_Sanitizer_API' rel=\"noopener\">Sanitizer API<\/a> &#8230;<\/p>\n<blockquote cite='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/HTML_Sanitizer_API'><p>\nThe HTML Sanitizer API allow developers to take untrusted strings of HTML and Document or DocumentFragment objects, and sanitize them for safe insertion into a document&#8217;s DOM.\n<\/p><\/blockquote>\n<p> &#8230; as another validation idea for HTML to add to our previous <a target=\"_blank\" title='HTML Online Validation Tidy Errors Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/html-online-validation-tidy-errors-tutorial' rel=\"noopener\">HTML Online Validation Tidy Errors Tutorial<\/a> efforts.<\/p>\n<p>Perhaps you&#8217;d like to try the &#8220;Usage&#8221; button of the <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/sanitizer_api_test.html_GETME\" title=\"sanitizer_api_test.html\" rel=\"noopener\">proof of concept <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/sanitizer_api_test.html\" title=\"Click picture\" rel=\"noopener\">web application<\/a> below &#8230;<\/p>\n<p><iframe style=\"width:100%;height:1000px;\" src=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/sanitizer_api_test.html\"><\/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='#d56492' onclick='var dv=document.getElementById(\"d56492\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/validation\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d56492' 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='#d63915' onclick='var dv=document.getElementById(\"d63915\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/linux\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63915' 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='#d63924' onclick='var dv=document.getElementById(\"d63924\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/browse\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63924' 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='#d63930' onclick='var dv=document.getElementById(\"d63930\"); 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='d63930' 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='#d63938' onclick='var dv=document.getElementById(\"d63938\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/selectionchange\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63938' 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='#d63946' onclick='var dv=document.getElementById(\"d63946\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/sms\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63946' 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='#d99999' onclick='var dv=document.getElementById(\"d99999\"); dv.innerHTML = \"<iframe width=670 height=600 src=\" + \"\/\/www.rjmprogramming.com.au\/ITblog\/tag\/tutorial\" + \"><\/iframe>&#8220;; dv.style.display = &#8220;block&#8221;;&#8217;>this<\/a> too.<\/p>\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='#d63981' onclick='var dv=document.getElementById(\"d63981\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/css\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63981' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Onto the recent XML Lint Validation Shared Encoding Tutorial we&#8217;d say what could &#8220;cheer things up&#8221;, shall we say, is to add some colour into the look of the XML Lint Validation web application. And to do this with inline &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/xml-lnt-validation-css-background-colour-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,1,37],"tags":[2419,2682,3672,1993,3531,1604,224,4796,251,252,281,354,380,385,2023,400,2288,3336,1840,452,4214,513,4792,4790,4791,555,557,3961,611,626,631,652,673,2032,2020,4787,1907,2287,835,861,1666,1712,1772,4798,4797,4709,2960,1133,1137,1159,1209,1212,2334,4789,4788,1319,1352,1429,2455,4799],"class_list":["post-63981","post","type-post","status-publish","format-standard","hentry","category-elearning","category-event-driven-programming","category-uncategorised","category-tutorials","tag-aesthetics","tag-background-colour","tag-broadband","tag-browse","tag-browsing","tag-collaboration","tag-colour","tag-colour-stop","tag-connect","tag-connection","tag-css","tag-dom","tag-email","tag-emoji","tag-encoding","tag-event","tag-fibre-to-the-node","tag-filename","tag-filereader","tag-form","tag-gobbledegook","tag-google","tag-google-home","tag-google-mesh","tag-google-wifi-mesh","tag-hardware-2","tag-hashtag","tag-hashtagging","tag-install","tag-ios","tag-iphone","tag-javascript","tag-keyboard","tag-lan","tag-linear-gradient","tag-mesh","tag-modem","tag-nbn","tag-network","tag-onclick","tag-ondblclick","tag-onsubmit","tag-port","tag-readasdataurl","tag-readasrext","tag-selectionchange","tag-setup","tag-share","tag-sharing","tag-sms","tag-style","tag-styling","tag-submit","tag-subnet","tag-subnetwork","tag-tutorial","tag-utf-8","tag-wifi","tag-wrap","tag-wrapping"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/63981"}],"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=63981"}],"version-history":[{"count":7,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/63981\/revisions"}],"predecessor-version":[{"id":64770,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/63981\/revisions\/64770"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=63981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=63981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=63981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}