From 1ba2ccac7f3e65aeb195aaec983e8e63a525f504 Mon Sep 17 00:00:00 2001 From: deuce <> Date: Sat, 20 Mar 2010 01:21:44 +0000 Subject: [PATCH] Add support for string parsing and the device control string "GET <URI>" --- src/ZuulTerm/chrome/content/Term.js | 64 +++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/src/ZuulTerm/chrome/content/Term.js b/src/ZuulTerm/chrome/content/Term.js index 6255afe43d..71efe54f90 100644 --- a/src/ZuulTerm/chrome/content/Term.js +++ b/src/ZuulTerm/chrome/content/Term.js @@ -1,5 +1,6 @@ var connection=null; var currtext=''; +var stringsequence={storing:false,value:'',type:0}; function writeHTML(data) { @@ -11,6 +12,8 @@ function writeHTML(data) var offe; currtext += data; + if(term==null) + return; term.innerHTML = currtext; var winVisible=win.innerHeight-win.scrollMaxY; @@ -52,13 +55,39 @@ function writeHTML(data) function writeText(data) { - data=data.replace(/&/g,'&'); - data=data.replace(/</g,'<'); - data=data.replace(/>/g,'>'); - data=data.replace(/'/g,'''); - data=data.replace(/"/g,'"'); - data=data.replace(/ /g,' '); - writeHTML(data); + if(stringsequence.storing) { + stringsequence.value += data; + } + else { + data=data.replace(/&/g,'&'); + data=data.replace(/</g,'<'); + data=data.replace(/>/g,'>'); + data=data.replace(/'/g,'''); + data=data.replace(/"/g,'"'); + data=data.replace(/ /g,' '); + writeHTML(data); + } +} + +function handleString(obj) +{ + var doc=document.getElementById("frame").contentDocument; + var term=doc.getElementById("terminal"); + var win=document.getElementById("frame").contentWindow; + var tmp; + + switch(obj.type) { + case '\x90': + tmp = obj.value.match(/^([^\s]+) (.*)/); + if(tmp != null) { + switch(tmp[1]) { + case 'GET': + win.location=tmp[2]; + break; + } + } + break; + } } function handleCtrl(byte) @@ -100,20 +129,37 @@ function handleCtrl(byte) case '\x85': // NEL (Next Line) writeHTML("<br>"); break; + case '\x98': // SOS (Start Of String) + case '\x90': // DCS (Device Control String) + case '\x9d': // OSC (Operating System Command) + case '\x9e': // PM (Privacy Message) + case '\x9f': // APC (Application Program Command) + stringsequence.storing=true; + stringsequence.value=''; + stringsequence.type=byte; + break; + case '\x9c': // ST (String Terminator) + stringsequence.storing=false; + handleString(stringsequence); + break; } } function UpdateTerm(data) { + var val; + while(data.length) { - data=data.replace(/^([^\x00-\x1F\x80-\x9f]*)/, function(matched, text) { + data=data.replace(/^([^\x00-\x1F\x80-\x9f]+)/, function(matched, text) { writeText(text); return ''; }); if(data.length) { - while(data.charCodeAt(0) < 32) { + val=data.charCodeAt(0); + while(val < 32 || (val >= 0x90 && val <= 0x9f)) { handleCtrl(data.substr(0,1)); data=data.substr(1); + val=data.charCodeAt(0); } } } -- GitLab