diff --git a/ebrowser.md b/ebrowser.md
deleted file mode 100644
index 0255f9c..0000000
--- a/ebrowser.md
+++ /dev/null
@@ -1,116 +0,0 @@
-### [Ebrowser](https://github.com/torappinfo/ebrowser): keyboard-friendly minimal suckless web browser
-Ebrowser is designed with the philosophy of [Android uweb browser](https://github.com/torappinfo/uweb) ([gitlab](https://gitlab.com/jamesfengcao/uweb)).
-
-- lightweight (less than 20k bytes) without bundled electron.
-- much less memory footprint than edge/chrome browser and highly performant.
-- keyboard friendly with vim-style keymaps and command line support in address bar.
-- [global redirection](https://uweb.surge.sh/en/redirect/index.html#) to bypass censorship.
-- user scripts at will. Ex. pressing "tr" to translate the page (need mapkeys.json config).
-- customizable.
-
-Note: Usually electron apps are heavyweight as they use browsers for simple things. Ebrowser uses core chromium effectively and very lightweight. Recommend to install electron separately.
-
-#### Installing (for Windows, MacOS and Linux)
-##### Install with prebuilt binaries
-You can find prebuilt binaries [here](https://github.com/torappinfo/ebrowser/releases).
-
-##### Install with nodejs
-
- npm install electron
- npm install ebrowser
-
-Run ebrowser
-
- electron ~/node_modules/ebrowser
-
-Later on, you can run "npm install electron" to update electron/chromium or "npm install ebrowser" to update ebrowser independently.
-
-##### Update app quickly without updating chromium
-Pressing "Alt" to show the menu bar and choose "Check for updates" under "Help". OR
-
-Type ":update" in the address bar and press "enter" key to update.
-
-Mirror urls could be used like ":update https://uwebzh.netlify.app/misc/ebrowser". All the mirrors listed on [uweb browser](https://uwebzh.netlify.app/en/readme/index.html) could be used. The update url needs to be changed accordingly to be the folder "misc/ebrowser" under the mirror site root url.
-
-#### Key shortcuts
-- CTRL+C: stop loading
-- CTRL+G: address bar to show page url
-- CTRL+L: focus to address bar
-- CTRL+T: new Tab
-- CTRL+SHIFT+T: restore closed Tab
-- CTRL+TAB: switch to next tab
-- CTRL+SHIFT+TAB: switch to previous tab
-- CTRL+W: close Tab
-- ALT+<-: go backward
-- ALT+->: go forward
-- CTRL+SHIFT+R: enable global redirection ("gredirect.json")
-- CTRL+R: disable global redirection
-- ESC: remove focus. similar to vi normal mode.
-- F1: Help
-- F5: page refresh/reload
-- F12: devtools
-
-#### Address bar commands
-- "/" for find-in-page
-- ":" for address bar commands
- - ac [bookmark/history path w/o ext] : load ".rec" file for autocomplete.
- - b [bookmarkfilename w/o ext] : bookmark current page in file.
- - bml [filename w/o extension]: load/execute the javascript file.
- - cert : allow invalid certificates w/o arguments, otherwise restore to default.
- - clear : the arguments could be
- - cache : clear cache
- - dns : clear dns cache
- - storage: clear site storage data.
- - {[options](https://www.electronjs.org/docs/latest/api/session#sescleardataoptions)}
- - ext [extension path]: load unpacked Chrome extension.
- - gr [gredirect index]: global redirection with corresponding index. Use the first global redirection url if no argument. Disable global redirection with any index out of the range.
- - js [js code] : execute JS code at OS level. Note: "javascript:..." is special url and thus works in the current web page, while ":js ..." commands can do any OS operations.
- - nc/uc : No Cookie forwarding/Use Cookie forwarding with global redirection.
- - nh/uh for No/Use url history.
- - nj/uj for No/Use external Javascript files.
- - nr/ur for No/Use "redirect.json" for domain redirection.
- - np : no proxy.
- - up [proxyName] : use proxy. privous proxy or the first proxy in proxy.json w/o [proxyName]. ":up" command also disables global and domain redirections, which are not restored by ":np".
- - ua [useragentName] : set user agent for future tabs. default user agent w/o arguments.
- - update [updateurl] : update the app. updateurl is optional.
- - pdf [filename w/o extension] {[options](https://www.electronjs.org/docs/latest/api/web-contents#contentsprinttopdfoptions)} : print to PDF file. All arguments are optional; empty option "{}" to capture long screenshot as vector graphics.
-- "!" address bar commands
- "!xx ..." evaluates "xx.js" with the whole text as arguments[0].
-
-#### Commands in no-focus mode (this mode is similar to vi Normal mode)
-Pressing "ESC" to enter no-focus mode if not sure.
-- ":" for address bar commands
-- "/" for find-in-page with address bar
-- "!" for "!" address bar commands
-
-The other commands are defined in "mapkeys.json", which will map keys to address bar commands.
-
-#### Configuration files
-- "config": lines of address bar commands.
-- "search.json": search engines as shortcut-queryUrl pairs.
-- "default.autoc": predefined strings for address bar auto completion.
-- "gredirect.json": global redirection urls as array of urls
-- "redirect.json": domain-replacementDomain pairs, default to be applied.
-- "mapkeys.json": keys-addressbarCommands pairs. The addressbar commands are multiple lines of address bar command separated by "\n".
-- "proxy.json": name-[ProxyConfig](https://www.electronjs.org/docs/latest/api/structures/proxy-config) pairs
-- "uas.json" : name-useragent pairs
-
-#### Javascript at three levels
-- Web page: urls like "javascript:" or bookmarklet command ":bml" run in web page.
-- Browser (or renderer process) : "!xx" evaluates "xx.js", which could manipulate address bar etc.
-- OS level (or main process) : ":js" to execute the following js code with all OS APIs available.
-
-#### New usages
-- Vector designing with web tech to replace Adobe Illustrator/Inkscape.
- - Design with web tech.
-
- - Printing to pdf with customized paper size.
- - Magnify the pdf paper size to the required size.
-
- OR
-
- - Adjust window width and use addressbar command line ":Pdf {}" to export vector graphics.
- - Use imageMagick to convert to any other vector graphics format.
-
-#### License
-You can copy or modify the code/program under the terms of the GPL3.0 or later versions.
\ No newline at end of file
diff --git a/en/ebrowserreadme/index.html b/en/ebrowserreadme/index.html
index b92eed8..a56ac47 100644
--- a/en/ebrowserreadme/index.html
+++ b/en/ebrowserreadme/index.html
@@ -95,6 +95,7 @@ npm install ebrowser
- ac [bookmark/history path w/o ext] : load ".rec" file for autocomplete.
- b [bookmarkfilename w/o ext] : bookmark current page in file.
+- bjs : Browser-level JavaScript execution.
- bml [filename w/o extension]: load/execute the javascript file.
- cert : allow invalid certificates w/o arguments, otherwise restore to default.
- clear : the arguments could be
@@ -109,8 +110,6 @@ npm install ebrowser
- gr [gredirect index]: global redirection with corresponding index. Use the first global redirection url if no argument. Disable global redirection with any index out of the range.
- js [js code] : execute JS code at OS level. Note: "javascript:..." is special url and thus works in the current web page, while ":js ..." commands can do any OS operations.
- nc/uc : No Cookie forwarding/Use Cookie forwarding with global redirection.
-- nh/uh for No/Use url history.
-- nj/uj for No/Use external Javascript files.
- nr/ur for No/Use "redirect.json" for domain redirection.
- np : no proxy.
- up [proxyName] : use proxy. privous proxy or the first proxy in proxy.json w/o [proxyName]. ":up" command also disables global and domain redirections, which are not restored by ":np".
@@ -144,9 +143,20 @@ npm install ebrowser
Javascript at three levels
- Web page: urls like "javascript:" or bookmarklet command ":bml" run in web page.
-- Browser (or renderer process) : "!xx" evaluates "xx.js", which could manipulate address bar etc.
+- Browser (or renderer process) :
+
+- ":bjs" to execute the following js code at browser level.
+- "!xx" evaluates "xx.js", which could manipulate address bar etc.
+
+
- OS level (or main process) : ":js" to execute the following js code with all OS APIs available.
+examples for ":js"/":bjs" commands
+
:js bJS=true //allow external Javascript files for web pages
+:js bJS=false //disallow external Javascript files for web pages
+:bjs bHistory=true //to record url history
+:bjs bQueryHistory=true //to record query/command history
+
New usages
-
diff --git a/en/index.xml b/en/index.xml
index ba38036..af11a59 100644
--- a/en/index.xml
+++ b/en/index.xml
@@ -6,7 +6,7 @@
Recent content on uweb browser: unlimited power
Hugo
en
- Mon, 24 Jun 2024 10:28:02 +0800
+ Mon, 24 Jun 2024 19:36:44 +0800
-
Text selection/processing
diff --git a/en/sitemap.xml b/en/sitemap.xml
index 333b9d2..f160384 100644
--- a/en/sitemap.xml
+++ b/en/sitemap.xml
@@ -71,7 +71,7 @@
/>
/en/
- 2024-06-24T10:28:02+08:00
+ 2024-06-24T19:36:44+08:00
/en/ebrowserreadme/
- 2024-06-24T09:46:43+08:00
+ 2024-06-24T19:36:44+08:00
/en/mirrors/
2024-06-18T23:17:17+08:00
@@ -539,7 +539,7 @@
/>
/en/unlist/
- 2024-06-24T10:28:02+08:00
+ 2024-06-24T19:36:44+08:00
{
- if (err) return;
+ if (err) {
+ coloncommand(":js fetch2file(repositoryurl,'mapkeys.json')");
+ return;
+ }
try {
mapKeys = JSON.parse(jsonStr);
}catch(e){}
@@ -126,9 +135,24 @@ You should have received a copy of the GNU General Public License along with thi
iTab = i;
tabs.children[iTab].classList.add('curWV');
}
+ function cbFinishLoad(e){
+ let tab = e.target;
+ let js = tab.dataset.jsonce;
+ if(js){
+ tab.dataset.jsonce = null;
+ tab.executeJavaScript(js,false);
+ }
+ if(!bHistory) return;
+ let histItem = tab.getTitle()+" "+tab.getURL()+"\n";
+ fs.appendFile(historyFile, histItem, (err) => {});
+ }
+ function initTab(tab){
+ tab.allowpopups = true;
+ tab.addEventListener('did-finish-load',cbFinishLoad);
+ }
function newTab(){
var tab = document.createElement('webview');
- tab.allowpopups = true;
+ initTab(tab);
tabs.appendChild(tab);
}
function tabInc(num){
@@ -157,6 +181,9 @@ You should have received a copy of the GNU General Public License along with thi
tabs.children[iTab].classList.add('curWV');
return getWinTitle();
}
+ function tabJS(js){
+ tabs.children[iTab].executeJavaScript(js,false);
+ }
function getWinTitle(){
let t=tabs.children[iTab];
let title = (iTab+1) + '/' + tabs.children.length;
@@ -186,33 +213,45 @@ You should have received a copy of the GNU General Public License along with thi
if(e.ctrlKey){
switch(key){
case "Home":
- tabs.children[iTab].src = "javascript:window.scrollTo(0,0)";
+ tabJS("window.scrollTo(0,0)");
return;
case "End":
- tabs.children[iTab].src="javascript:window.scrollTo(0,document.body.scrollHeight)"
+ tabJS("window.scrollTo(0,document.body.scrollHeight)");
return;
}
return;
}
+ SCROLL: do {
+ let h = -32;
switch(key){
+ case " ":
+ if(inputE === document.activeElement) return;
+ if(e.shiftKey){
+ h = -3*document.documentElement.clientHeight/4;
+ break;
+ }
case "PageDown":
- tabs.children[iTab].src =
- "javascript:window.scrollBy(0,3*document.documentElement.clientHeight/4)";
- return;
+ h = 3*document.documentElement.clientHeight/4;
+ break;
case "PageUp":
- tabs.children[iTab].src = "javascript:window.scrollBy(0,-3*document.documentElement.clientHeight/4)";
- return;
+ h = -3*document.documentElement.clientHeight/4;
+ break;
case "ArrowDown":
- if(inputE !== document.activeElement || 0==inputE.nextElementSibling.children.length)
- tabs.children[iTab].src="javascript:window.scrollBy(0,32)";
- return;
+ h = 32;
case "ArrowUp":
- if(inputE !== document.activeElement || 0==inputE.nextElementSibling.children.length)
- tabs.children[iTab].src="javascript:window.scrollBy(0,-32)";
- return;
-
+ if(inputE === document.activeElement &&
+ 0!==inputE.nextElementSibling.children.length)
+ return;
+ break;
+ default:
+ break SCROLL;
}
+ let js = `javascript:window.scrollBy(0,${h})`;
+ tabJS(js);
+ return;
+ }while(false);
+
if(inputE === document.activeElement){
if (9===e.keyCode){//tab completion
}
@@ -269,6 +308,9 @@ You should have received a copy of the GNU General Public License along with thi
case "b":
bookmark(args);
return;
+ case "bjs":
+ eval(cmd.slice(5));
+ return;
case "bml":
bml(args);
return;
@@ -375,15 +417,16 @@ You should have received a copy of the GNU General Public License along with thi
}
}
var url=q;
+ NOREC: do{
do {
if(q.length>12){
let c6 = q.charCodeAt(6);
if(47===c6){// '/'
let c5 = q.charCodeAt(5);
if(47===c5 && 58===q.charCodeAt(4))//http/file urls
- break;
+ break NOREC;
if(58===c5 && 47===q.charCodeAt(7))//https://
- break;
+ break NOREC;
}else if(q.startsWith("javascript:")){
tabs.children[iTab].executeJavaScript(q.substring(11),false);
recQueryHistory(q);
@@ -398,14 +441,14 @@ You should have received a copy of the GNU General Public License along with thi
}
if(q.indexOf('.')>0){
url = 'https://'+q;
- break;
+ break NOREC;
}
url = defaultSE.replace('%s',q);
- recQueryHistory(q);
break;
}
url = bang(q, iS);
- recQueryHistory(q);
+ }while(false);
+ recQueryHistory(q);
}while(false);
tabs.children[iTab].src=url;
}
@@ -501,6 +544,7 @@ function autocomplete(inp,container,arr) {
";
- fs.appendFileSync(htmlFN,postscript);
- }catch(e){
- htmlFN = readmeP;
- }
- }
- let js=`tabs.children[iTab].src="file://${htmlFN}"`;
+ const htmlFN = path.join(__dirname,readme);
+ let js=`{let t=tabs.children[iTab];t.dataset.jsonce=BML_md;t.src="file://${htmlFN}"}`;
win.webContents.executeJavaScript(js,false)
}
diff --git a/sitemap.xml b/sitemap.xml
index 8cfe639..393e7cb 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -4,7 +4,7 @@
/en/sitemap.xml
- 2024-06-24T10:28:02+08:00
+ 2024-06-24T19:36:44+08:00