diff --git a/ebrowser.md b/ebrowser.md
new file mode 100644
index 0000000..0255f9c
--- /dev/null
+++ b/ebrowser.md
@@ -0,0 +1,116 @@
+### [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 a56ac47..b92eed8 100644
--- a/en/ebrowserreadme/index.html
+++ b/en/ebrowserreadme/index.html
@@ -95,7 +95,6 @@ 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
@@ -110,6 +109,8 @@ 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".
@@ -143,20 +144,9 @@ npm install ebrowser
Javascript at three levels
- Web page: urls like "javascript:" or bookmarklet command ":bml" run in web page.
-- Browser (or renderer process) :
-
-- ":bjs" to execute the following js code at browser level.
-- "!xx" evaluates "xx.js", which could manipulate address bar etc.
-
-
+- 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.
-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 af11a59..ba38036 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 19:36:44 +0800
+ Mon, 24 Jun 2024 10:28:02 +0800
-
Text selection/processing
diff --git a/en/sitemap.xml b/en/sitemap.xml
index f160384..333b9d2 100644
--- a/en/sitemap.xml
+++ b/en/sitemap.xml
@@ -71,7 +71,7 @@
/>
/en/
- 2024-06-24T19:36:44+08:00
+ 2024-06-24T10:28:02+08:00
/en/ebrowserreadme/
- 2024-06-24T19:36:44+08:00
+ 2024-06-24T09:46:43+08:00
/en/mirrors/
2024-06-18T23:17:17+08:00
@@ -539,7 +539,7 @@
/>
/en/unlist/
- 2024-06-24T19:36:44+08:00
+ 2024-06-24T10:28:02+08:00
{
- if (err) {
- coloncommand(":js fetch2file(repositoryurl,'mapkeys.json')");
- return;
- }
+ if (err) return;
try {
mapKeys = JSON.parse(jsonStr);
}catch(e){}
@@ -135,24 +126,9 @@ 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');
- initTab(tab);
+ tab.allowpopups = true;
tabs.appendChild(tab);
}
function tabInc(num){
@@ -181,9 +157,6 @@ 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;
@@ -213,45 +186,33 @@ You should have received a copy of the GNU General Public License along with thi
if(e.ctrlKey){
switch(key){
case "Home":
- tabJS("window.scrollTo(0,0)");
+ tabs.children[iTab].src = "javascript:window.scrollTo(0,0)";
return;
case "End":
- tabJS("window.scrollTo(0,document.body.scrollHeight)");
+ tabs.children[iTab].src="javascript: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":
- h = 3*document.documentElement.clientHeight/4;
- break;
+ tabs.children[iTab].src =
+ "javascript:window.scrollBy(0,3*document.documentElement.clientHeight/4)";
+ return;
case "PageUp":
- h = -3*document.documentElement.clientHeight/4;
- break;
+ tabs.children[iTab].src = "javascript:window.scrollBy(0,-3*document.documentElement.clientHeight/4)";
+ return;
case "ArrowDown":
- h = 32;
+ if(inputE !== document.activeElement || 0==inputE.nextElementSibling.children.length)
+ tabs.children[iTab].src="javascript:window.scrollBy(0,32)";
+ return;
case "ArrowUp":
- if(inputE === document.activeElement &&
- 0!==inputE.nextElementSibling.children.length)
- return;
- break;
- default:
- break SCROLL;
+ if(inputE !== document.activeElement || 0==inputE.nextElementSibling.children.length)
+ tabs.children[iTab].src="javascript:window.scrollBy(0,-32)";
+ return;
+
}
- let js = `javascript:window.scrollBy(0,${h})`;
- tabJS(js);
- return;
- }while(false);
-
if(inputE === document.activeElement){
if (9===e.keyCode){//tab completion
}
@@ -308,9 +269,6 @@ 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;
@@ -417,16 +375,15 @@ 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 NOREC;
+ break;
if(58===c5 && 47===q.charCodeAt(7))//https://
- break NOREC;
+ break;
}else if(q.startsWith("javascript:")){
tabs.children[iTab].executeJavaScript(q.substring(11),false);
recQueryHistory(q);
@@ -441,14 +398,14 @@ You should have received a copy of the GNU General Public License along with thi
}
if(q.indexOf('.')>0){
url = 'https://'+q;
- break NOREC;
+ break;
}
url = defaultSE.replace('%s',q);
+ recQueryHistory(q);
break;
}
url = bang(q, iS);
- }while(false);
- recQueryHistory(q);
+ recQueryHistory(q);
}while(false);
tabs.children[iTab].src=url;
}
@@ -544,7 +501,6 @@ function autocomplete(inp,container,arr) {
";
+ fs.appendFileSync(htmlFN,postscript);
+ }catch(e){
+ htmlFN = readmeP;
+ }
+ }
+ let js=`tabs.children[iTab].src="file://${htmlFN}"`;
win.webContents.executeJavaScript(js,false)
}
diff --git a/sitemap.xml b/sitemap.xml
index 393e7cb..8cfe639 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -4,7 +4,7 @@
/en/sitemap.xml
- 2024-06-24T19:36:44+08:00
+ 2024-06-24T10:28:02+08:00