Compare commits

...

722 commits

Author SHA1 Message Date
James Feng Cao
1af2894e57 uweb1146: pager and search engine for remote/local txt/html/md (optional .zst,.gz,.br compressed) 2026-01-06 19:40:56 +08:00
James Feng Cao
892fce9ce6 uweb1146: remote/local txt/html/md (optional .zst,.gz,.br compressed) as search engines 2026-01-06 18:55:20 +08:00
James Feng Cao
086559bda0 uweb1145: fix % and newline handling in homescreen input 2026-01-01 16:55:02 +08:00
James Feng Cao
8cf9fd9197 uweb1144: add novel reader support for large text/html files (could be .gz,.br, .zst compressed) 2025-12-31 15:58:22 +08:00
James Feng Cao
98d515de60 enhance url services with %u etc. 2025-12-31 09:14:27 +08:00
James Feng Cao
54f8ad1d39 enhance url services with %u, %t support 2025-12-30 23:12:20 +08:00
James Feng Cao
6a07aa593a add documents to run shell command on address bar 2025-12-05 19:05:14 +08:00
James Feng Cao
8e3c207e77 use https://l/ instead of local 2025-12-02 14:16:29 +08:00
James Feng Cao
3f3d36c5f3 reflow text for wider dialog 2025-11-23 15:48:42 +08:00
James Feng Cao
c15f213f20 add AI engines 2025-11-15 11:10:02 +08:00
James Feng Cao
f78cc2c121 . 2025-11-15 08:07:24 +08:00
James Feng Cao
bcfb6cdfe3 update README 2025-11-15 07:57:27 +08:00
James Feng Cao
bb961b0504 . 2025-11-14 21:38:28 +08:00
James Feng Cao
3ccd3bcc18 use uweb.codeberg 2025-11-12 14:55:47 +08:00
James Feng Cao
d2e4e3ad19 minor fix 2025-11-12 14:10:12 +08:00
James Feng Cao
2bb5fda2de homescreen.html: remove home5.mht as it is already implemented in uweb 2025-11-10 08:01:28 +08:00
James Feng Cao
feebf8e6aa uweb1142: fix homescreen set as a url 2025-11-10 07:47:58 +08:00
James Feng Cao
2fa071445e remove dead link 2025-11-10 07:11:43 +08:00
James Feng Cao
ee1f1f72c4 add back n.cn for deepseek 2025-11-08 20:50:45 +08:00
James Feng Cao
195f795ac6 uweb1141: optimization 2025-11-08 14:54:32 +08:00
James Feng Cao
c5b174fbf8 rewording 2025-11-07 09:16:57 +08:00
James Feng Cao
a94bc639fd . 2025-11-06 21:15:56 +08:00
James Feng Cao
af7eeac2b6 uweb1140: add mimetype uwebS for sharing 2025-11-06 19:20:44 +08:00
James Feng Cao
a166e7e286 fix menu Edit in textprocess 2025-11-06 17:13:12 +08:00
James Feng Cao
6ab370a9f4 uweb 1140: add mimetype uwebS for sharing 2025-11-06 11:09:33 +08:00
James Feng Cao
954890ac92 uweb1139: \n support in default.input & default.autoc 2025-10-30 21:15:51 +08:00
James Feng Cao
50420230f7 add example AI prompts 2025-10-30 17:27:10 +08:00
James Feng Cao
5ec4b646a5 uweb1039: associate mimetype uwebAddr to address bar text 2025-10-29 20:14:40 +08:00
James Feng Cao
84fe1555fe update README 2025-10-28 19:58:25 +08:00
James Feng Cao
786a23d12f uweb1038: space+newline in main home screen to use addressbar+input as effective query 2025-10-28 16:37:29 +08:00
James Feng Cao
927d84fd82 adapt input.html for gitee 2025-10-21 11:02:41 +08:00
James Feng Cao
1aa932b1b6 remove common characters for chinese input with parts 2025-10-19 12:33:12 +08:00
James Feng Cao
2b530c33fb add zh/input.md 2025-10-15 10:27:41 +08:00
James Feng Cao
e353ce3c8d enable address bar as IME 2025-10-13 20:50:55 +08:00
James Feng Cao
221605143a enable address bar as IME 2025-10-13 20:44:43 +08:00
James Feng Cao
ecdb762bb4 enable address bar as IME 2025-10-13 20:39:22 +08:00
James Feng Cao
e2c6b3ca50 enable address bar as IME 2025-10-13 20:28:53 +08:00
James Feng Cao
1902b60b61 README: reword 2025-10-13 09:55:34 +08:00
James Feng Cao
d4eb4871a7 refine README 2025-10-12 16:31:33 +08:00
James Feng Cao
7ade3389e1 update tips 2025-10-12 15:46:25 +08:00
James Feng Cao
b8eb13ac28 more tips 2025-10-12 15:16:00 +08:00
James Feng Cao
208c1c5715 uweb1136: space-beginning address bar autocompletion as input method 2025-10-12 06:37:37 +08:00
James Feng Cao
780b2e9f10 uweb1136: space-beginning address bar autocompletion as input method for AI prompts 2025-10-11 09:21:06 +08:00
James Feng Cao
ee3f611b42 uweb1136: space-beginning address bar autocompletion as input method 2025-10-11 09:04:38 +08:00
James Feng Cao
c7b85148ba update search engines 2025-09-27 16:26:14 +08:00
James Feng Cao
9776545a73 update search engines 2025-09-26 06:56:41 +08:00
James Feng Cao
b5a09277d5 update search engines 2025-09-25 08:22:14 +08:00
James Feng Cao
bcb863902b update AI engines 2025-09-24 09:39:25 +08:00
James Feng Cao
813b8749cc update gitcode AI 2025-09-23 22:29:55 +08:00
James Feng Cao
0a0d973ffc . 2025-09-20 14:46:00 +08:00
James Feng Cao
fee4dab5b2 uweb 1134 to fix uweb2edit2.js for stubborn websites 2025-09-19 11:45:15 +08:00
James Feng Cao
b3b33450b9 . 2025-09-18 21:29:09 +08:00
James Feng Cao
c2b540411f uweb2edit2.js works for ebrowser now 2025-09-18 21:04:51 +08:00
James Feng Cao
864d51ce1c . 2025-09-18 15:53:36 +08:00
James Feng Cao
567e800d70 add val.town script for redirection 2025-09-18 15:34:08 +08:00
James Feng Cao
f2c8b320b2 add statichost.eu 2025-09-02 06:36:42 +08:00
James Feng Cao
3f22c34c42 cleanup mirror links 2025-09-02 06:25:42 +08:00
James Feng Cao
527a2e1582 cleanup mirror links 2025-09-02 06:18:20 +08:00
James Feng Cao
b0e376a88a cleanup mirror links 2025-09-02 05:54:13 +08:00
James Feng Cao
73a4920e83 cleanup download mirrors 2025-08-31 16:52:30 +08:00
James Feng Cao
3e30ddb64d remove deno deployment 2025-08-30 09:11:09 +08:00
James Feng Cao
0a8830bf64 search engine cleanup 2025-08-24 08:04:10 +08:00
James Feng Cao
39f2455692 uweb1029: ':cclear' to clear web storage 2025-08-22 08:40:29 +08:00
James Feng Cao
bad6a9cb2a add more search engines 2025-08-21 17:40:07 +08:00
James Feng Cao
c1cc20b4cd update download urls 2025-08-19 08:44:30 +08:00
James Feng Cao
bdf6a68cf5 update AI search engines 2025-08-16 11:34:22 +08:00
James Feng Cao
a9b55d4542 add local command search engine templates 2025-08-14 05:07:54 +08:00
James Feng Cao
bd9c7db5f3 . 2025-08-09 08:30:31 +08:00
James Feng Cao
db86c08922 uweb version 1126 2025-08-05 09:08:21 +08:00
James Feng Cao
de65ce6dda uweb1025: add txt2img 2025-07-28 10:07:12 +08:00
James Feng Cao
393db46670 add more AI models 2025-07-27 17:05:12 +08:00
James Feng Cao
5e1736e925 add AI engines with many models 2025-07-27 16:51:48 +08:00
James Feng Cao
ea636766f4 puter.js AI chat support 2025-07-27 08:48:10 +08:00
James Feng Cao
04fa21b542 AI models with puter.html 2025-07-26 16:13:29 +08:00
James Feng Cao
11620ae381 update AI engines 2025-07-19 11:04:28 +08:00
James Feng Cao
a44d3fa144 update AI engines 2025-07-18 12:03:36 +08:00
James Feng Cao
62adb2b754 update AI engines 2025-07-17 10:21:39 +08:00
James Feng Cao
24f7bfa0b2 uweb 1122: offline site cache to support urls with special chars like ? etc 2025-05-11 08:19:17 +08:00
James Feng Cao
3d3eb3b6cc uweb1121: i:ch to load part of the content 2025-04-09 19:14:42 +08:00
James Feng Cao
3a357e0743 fix broken links 2025-04-09 01:02:22 +08:00
James Feng Cao
0e4320edc9 remove dead url services 2025-04-08 23:20:04 +08:00
James Feng Cao
9ba86bb3d6 remove dead search engines in en/search 2025-04-08 23:08:17 +08:00
James Feng Cao
108a60971a remove dead search engines in zh/search 2025-04-08 22:37:29 +08:00
James Feng Cao
e350689cc0 update search engines 2025-04-08 21:30:38 +08:00
James Feng Cao
e3a5de5ccd update search engines 2025-04-08 21:26:07 +08:00
James Feng Cao
c2b357850d uweb1120: %s url can be the first search engine now 2025-04-05 21:27:00 +08:00
James Feng Cao
128b049fa1 update AI engines 2025-04-05 09:13:28 +08:00
James Feng Cao
25891f59a8 update AI engines 2025-04-03 20:59:49 +08:00
James Feng Cao
2441072961 update AI engines 2025-04-03 11:16:47 +08:00
James Feng Cao
9087af7aa0 uweb1118: i:0UA1 to open url with PC useragent 2025-04-01 22:58:43 +08:00
James Feng Cao
8712b5befb add notes to search engines 2025-04-01 11:45:35 +08:00
James Feng Cao
3e766c8bbc uweb1117: uweb2edit2 args support 2025-03-31 19:04:52 +08:00
James Feng Cao
821cf296ce fix webdav.html templates 2025-03-31 12:36:02 +08:00
James Feng Cao
cd82f61dab uweb2edit2.js: args support 2025-03-31 10:37:24 +08:00
James Feng Cao
0a354c6805 enhance termux tools 2025-03-30 18:26:11 +08:00
James Feng Cao
85bb0fde7e refine backup.html 2025-03-28 20:50:21 +08:00
James Feng Cao
fd583dc986 refine backup.html 2025-03-28 20:42:35 +08:00
James Feng Cao
7c7326e42b refine backup.html 2025-03-28 20:20:15 +08:00
James Feng Cao
c05bcf6d45 refine backup.html 2025-03-28 20:06:00 +08:00
James Feng Cao
26234f08a7 uweb1115: disable android 15 edge-to-edge default 2025-03-28 18:47:10 +08:00
James Feng Cao
acbd5240e6 update engines 2025-03-27 23:17:19 +08:00
James Feng Cao
cda8946882 add www4.bing.com as backup 2025-03-27 15:53:57 +08:00
James Feng Cao
1d91148ff6 uweb 1113: default.cmds uwebA mimetype support 2025-03-17 21:29:12 +08:00
James Feng Cao
4fb1ce6fad update AI engines 2025-03-16 15:43:09 +08:00
James Feng Cao
48fd60afff wol support 2025-03-15 21:13:12 +08:00
James Feng Cao
64a0173af5 uweb 1111: auto enter support for AI engines 2025-03-14 09:47:02 +08:00
James Feng Cao
5ef9646733 update baidu deepseek url 2025-03-11 18:37:32 +08:00
James Feng Cao
14d5434b11 uweb1109: use uwebset.js 2025-03-09 15:03:14 +08:00
James Feng Cao
67d28970b7 update AI engines 2025-03-08 22:23:58 +08:00
James Feng Cao
d699f91476 update AI engines 2025-03-08 21:48:22 +08:00
James Feng Cao
bf349caa52 update AI engines 2025-03-07 09:52:20 +08:00
James Feng Cao
a55c2d8e49 add notes on n.cn to use deepseek 2025-03-06 21:08:26 +08:00
James Feng Cao
a3792d15c7 update AI engines 2025-03-06 17:05:57 +08:00
James Feng Cao
0c31a55c11 uweb1106: refine uweb2ta2.js 2025-03-05 11:27:44 +08:00
James Feng Cao
e46776a7a7 uweb1105 2025-03-04 18:24:14 +08:00
James Feng Cao
365b1bcde4 update wenxiaobai url 2025-03-04 14:15:15 +08:00
James Feng Cao
4309114127 update AI engines 2025-03-04 11:33:55 +08:00
James Feng Cao
b461eea78f add gitcode deepseek 2025-03-02 15:38:12 +08:00
James Feng Cao
72721e02ec update links.md 2025-03-02 14:00:29 +08:00
James Feng Cao
508cfa192a update documents for links 2025-03-02 11:37:41 +08:00
James Feng Cao
ce3fca4d75 add menus for download options menu 2025-03-01 21:45:40 +08:00
James Feng Cao
91ba2ed8ea support specific submenus for images and downloading 2025-03-01 16:01:29 +08:00
James Feng Cao
61dc27a6e3 uweb1102 2025-02-28 16:12:32 +08:00
James Feng Cao
ee818cc5ae update baidu deepseek 2025-02-28 10:33:33 +08:00
James Feng Cao
f01ec1037e uweb1011 2025-02-27 19:31:16 +08:00
James Feng Cao
8c49fc58bb add link menus to view huge files 2025-02-26 22:57:37 +08:00
James Feng Cao
b56c20fd21 uweb1100: enhance html file as data cruncher and presenter for url as remote data 2025-02-26 21:35:41 +08:00
James Feng Cao
cae83394ef uweb1099: html as data cruncher and presenter for url as remote data 2025-02-26 19:59:02 +08:00
James Feng Cao
5dd5881557 uweb1099: html as data cruncher and presenter for url as remote data 2025-02-26 19:31:59 +08:00
James Feng Cao
e58d618e32 uweb1097: fix for oppo Deepseek 2025-02-25 10:39:23 +08:00
James Feng Cao
a37386ea3c uweb1095: fix wrong browser version on huawei phones 2025-02-23 12:11:19 +08:00
James Feng Cao
ac8878070a update AI engines 2025-02-22 23:26:31 +08:00
James Feng Cao
30ca583021 update AI engines 2025-02-22 13:13:24 +08:00
James Feng Cao
9674833907 uweb1094: uweb2input.js arguments support 2025-02-21 21:17:50 +08:00
James Feng Cao
3e79ad2ae4 update AI engines 2025-02-21 19:51:05 +08:00
James Feng Cao
2c78355c54 update AI engines 2025-02-20 20:07:26 +08:00
James Feng Cao
9c4c089161 update AI engines 2025-02-14 09:50:11 +08:00
James Feng Cao
ebc3b59c8c uweb 1093: bookmarklet argument support 2025-02-13 09:44:40 +08:00
James Feng Cao
34078ecd12 update AI engines 2025-02-09 16:18:38 +08:00
James Feng Cao
e0114cf562 use gitee releases in latest.html 2025-02-05 16:05:10 +08:00
James Feng Cao
95af55d1f3 add multiple deepseek AI providers 2025-02-03 17:35:21 +08:00
James Feng Cao
1f562f8545 add multiple deepseek AI providers 2025-02-03 17:16:30 +08:00
James Feng Cao
4109edb7e8 update AI engines 2025-02-02 10:38:17 +08:00
James Feng Cao
574648668f update AI engines 2025-01-27 20:29:41 +08:00
James Feng Cao
01b4d5f28b update AI engines 2025-01-08 22:55:22 +08:00
James Feng Cao
82c4d83dd8 update AI engines 2025-01-07 17:51:54 +08:00
James Feng Cao
352e080764 update AI engines 2025-01-07 09:55:12 +08:00
James Feng Cao
d649e64efe update AI engines 2025-01-06 16:21:12 +08:00
James Feng Cao
323627f3b7 update AI engines 2025-01-05 17:34:35 +08:00
James Feng Cao
f6034aae8f update AI engines 2025-01-05 17:10:48 +08:00
James Feng Cao
5c15ceac3a uweb1089: cleanup 2025-01-01 09:20:54 +08:00
James Feng Cao
7b2a5104f5 update documents for global redirection 2024-12-28 19:32:56 +08:00
James Feng Cao
bfea5d72ce update download mirrors 2024-12-27 19:48:17 +08:00
James Feng Cao
e51ff9a559 update AI engines 2024-12-25 10:34:42 +08:00
James Feng Cao
a00da09ae6 uweb1088: support uweb2edit 2024-12-16 08:36:15 +08:00
James Feng Cao
4a4db7d56d add uptodown link 2024-12-15 11:41:24 +08:00
James Feng Cao
df002a81be uweb1087: adaptive UI for AI 2024-12-15 09:07:13 +08:00
James Feng Cao
b5594cb4cd cleanup 2024-12-14 14:47:00 +08:00
James Feng Cao
659461798b cleanup 2024-12-14 14:38:54 +08:00
James Feng Cao
46a7b279f2 cleanup 2024-12-14 14:25:30 +08:00
James Feng Cao
357512f654 uweb1086: alias support for common phrases for input method 2024-12-14 11:33:25 +08:00
James Feng Cao
778dec7cdc uweb1085: allow newline in complex query 2024-12-13 15:53:11 +08:00
James Feng Cao
9093bc813a uweb1085: allow newline in complex query 2024-12-13 15:43:29 +08:00
James Feng Cao
cc6986bb64 cleanup 2024-12-13 09:13:41 +08:00
James Feng Cao
96db559383 live tv channels: use active repository 2024-12-12 19:13:00 +08:00
James Feng Cao
faa76818ee live tv channels: use active repository 2024-12-12 18:59:44 +08:00
James Feng Cao
c934f58bae live tv channels: use active repository 2024-12-12 18:34:18 +08:00
James Feng Cao
5a4fb9936b live tv channels: use active repository 2024-12-12 17:08:52 +08:00
James Feng Cao
112c92ccbf Top menu translation 2024-12-12 14:43:32 +08:00
James Feng Cao
6ca6779459 update manual 2024-12-12 11:47:16 +08:00
James Feng Cao
3ccf302f60 uweb1084: cleanup documentation 2024-12-12 09:59:39 +08:00
James Feng Cao
4d6fe8712d cleanup 2024-12-11 21:03:23 +08:00
James Feng Cao
12b4c08265 fix //index.html 2024-12-11 20:56:01 +08:00
James Feng Cao
f0666e2fb7 with canonical links 2024-12-11 19:53:39 +08:00
James Feng Cao
01572990b7 add cf worker code link for redirection 2024-12-11 19:15:03 +08:00
James Feng Cao
9d8061b12a use 'echo -n' instead of printf 2024-12-11 16:02:48 +08:00
James Feng Cao
3d4c17a7b3 uweb1083: uweb2ta.js to support append mode 2024-12-10 23:45:50 +08:00
James Feng Cao
97870dfdd4 uweb1083: uweb2ta.js to support append mode 2024-12-10 18:00:48 +08:00
James Feng Cao
216b7635b5 uweb1082: :cinput to choose text file as keyboard input 2024-12-10 10:23:25 +08:00
James Feng Cao
4fefb9ace0 update AI engines 2024-12-05 20:30:56 +08:00
James Feng Cao
f89c4903aa update AI engines 2024-12-05 20:20:54 +08:00
James Feng Cao
774a31259a update AI engines 2024-12-05 20:14:57 +08:00
James Feng Cao
378ad4f3c4 update search.md 2024-12-03 10:23:22 +08:00
James Feng Cao
b5945ecfa2 latest.html to support multiple languages 2024-12-03 09:52:33 +08:00
James Feng Cao
c5c29225b9 update search engines 2024-12-02 15:22:56 +08:00
James Feng Cao
57855cb1cb add link to search engine md file 2024-12-02 13:10:24 +08:00
James Feng Cao
ac808be6e5 add link to search engine md file 2024-12-02 13:05:39 +08:00
James Feng Cao
fab514198e update notes for search engines 2024-12-02 12:32:43 +08:00
James Feng Cao
5c8f1394ee uweb 1081 2024-12-02 10:37:34 +08:00
James Feng Cao
20bc9fdffd uweb 1080: enhance uweb2ta2.js 2024-12-01 19:27:40 +08:00
James Feng Cao
add3df8eb5 update AI engines 2024-12-01 14:04:54 +08:00
James Feng Cao
aaa83eaeb8 update AI engines 2024-11-29 00:04:58 +08:00
James Feng Cao
498a1f04b5 update AI engines 2024-11-28 22:45:20 +08:00
James Feng Cao
07663f9268 add AI engines 2024-11-28 21:29:24 +08:00
James Feng Cao
79ee17ce2a uweb 1077: add uweb2ta2.js 2024-11-28 16:37:01 +08:00
James Feng Cao
0f3b825126 uweb 1077 to support more AI engines 2024-11-28 16:06:27 +08:00
James Feng Cao
77cea26bd1 update AI engines 2024-11-25 19:57:15 +08:00
James Feng Cao
3d86036df1 use sourceforge for downloading 2024-11-24 18:25:37 +08:00
James Feng Cao
e576eee4ae use sourceforge for downloading 2024-11-24 18:10:51 +08:00
James Feng Cao
79defaf371 update redirect.md 2024-11-18 14:33:41 +08:00
James Feng Cao
fe734f52b0 update redirect.md 2024-11-18 14:31:27 +08:00
James Feng Cao
0e282ef72c update redirect.md 2024-11-18 10:27:56 +08:00
James Feng Cao
d2cd57fb1d uweb1075: global redirection works for AI sites and login 2024-11-17 11:51:09 +08:00
James Feng Cao
88c32485d1 update AI engines 2024-11-13 19:49:44 +08:00
James Feng Cao
86c36ecac0 update AI engines 2024-11-13 10:15:40 +08:00
James Feng Cao
5815339d3d uweb1073 to support proxies with username and password 2024-11-11 11:28:38 +08:00
James Feng Cao
fa234b7aac uweb version 1.0.1072 2024-11-08 19:29:30 +08:00
James Feng Cao
6e6ceec5ee uweb version 1.0.1070 2024-11-01 10:39:45 +08:00
James Feng Cao
3a435393b6 uweb version 1.0.1068 2024-10-24 17:35:58 +08:00
James Feng Cao
f82621e0b3 uweb version 1.0.1067 2024-10-23 09:27:12 +08:00
James Feng Cao
9b434e8d68 uweb version 1.0.1066 2024-10-18 10:20:46 +08:00
James Feng Cao
5393216019 uweb version 1064 2024-10-16 11:25:57 +08:00
James Feng Cao
d3e36ae437 add css/nojscopy.js to disable webpage clipboard copy 2024-10-13 16:47:00 +08:00
James Feng Cao
3a6f6b546b uweb 1060 2024-10-04 10:34:03 +08:00
James Feng Cao
205efccabd uweb 1058 2024-09-29 19:44:44 +08:00
James Feng Cao
07b9f48905 update AI engines 2024-09-28 12:04:31 +08:00
James Feng Cao
c0a37d6379 update AI engines 2024-09-26 09:14:46 +08:00
James Feng Cao
93e3051e15 uweb 1057 2024-09-02 17:35:40 +08:00
James Feng Cao
a46482ada7 uweb updates to 1056 2024-08-30 07:59:28 +08:00
James Feng Cao
5c2b79c14b uweb updates to 1055 2024-08-29 08:57:54 +08:00
James Feng Cao
f99e678a5d use gitee for zh 2024-08-26 10:12:45 +08:00
James Feng Cao
f065be8288 uweb1054: crontab to work on API level 31+ 2024-08-25 22:13:00 +08:00
James Feng Cao
08b1a02684 update mirrors 2024-08-25 12:19:22 +08:00
James Feng Cao
e021d1d319 uweb 1053: target API 35 2024-08-25 09:20:56 +08:00
James Feng Cao
92e3efcbd6 fix typos of files:// 2024-08-21 20:36:40 +08:00
James Feng Cao
a01d043575 add data clearing menu 2024-08-20 09:04:05 +08:00
James Feng Cao
434460c8bb update search engines 2024-08-19 11:04:49 +08:00
James Feng Cao
504c66ea4a update AI engines 2024-08-18 12:19:33 +08:00
James Feng Cao
3fd90ec47e update AI engines 2024-08-17 12:33:24 +08:00
James Feng Cao
aa0342a5de add AI search engines 2024-08-12 07:09:58 +08:00
James Feng Cao
1cae16f750 ebrowser to support download context menu 2024-08-04 14:07:23 +08:00
James Feng Cao
3d64e218e7 add AI engines 2024-07-16 10:21:18 +08:00
James Feng Cao
e469cb1a87 ebrowser 1.0.58 2024-07-12 11:06:22 +08:00
James Feng Cao
47777c299e update AI engines 2024-07-10 11:49:15 +08:00
James Feng Cao
b2e9cd1d31 update AI engines 2024-07-09 11:57:26 +08:00
James Feng Cao
7792c764b2 update AI engines 2024-07-03 15:31:57 +08:00
James Feng Cao
e4da0e72b8 update AI engines 2024-07-02 09:56:41 +08:00
James Feng Cao
9d005633c8 uweb 1.0.49 to use s2ta.js instead of hash2textarea.js 2024-07-01 19:54:24 +08:00
James Feng Cao
093a4ef3ff ebrowser v1.0.53 2024-07-01 12:15:39 +08:00
James Feng Cao
5d062edbfa ebrowser v1.0.52 2024-07-01 10:11:01 +08:00
James Feng Cao
5e3172ece0 ebrowser v1.0.51: download.json to add user-defined context-menu 2024-06-30 17:04:50 +08:00
James Feng Cao
f3ea023929 update AI engines 2024-06-29 22:04:44 +08:00
James Feng Cao
6fc7d22514 ebrowser 1.0.45: sitejs/sitecss support 2024-06-29 21:27:48 +08:00
James Feng Cao
e28838f738 ebrowser v1.0.44 2024-06-29 16:48:09 +08:00
James Feng Cao
c8c7c4e896 ebrowser v1.0.43 2024-06-29 08:57:52 +08:00
James Feng Cao
cbfffcd34f ebrowser v1.0.42 2024-06-29 08:34:45 +08:00
James Feng Cao
00ccd791ed ebrowser v1.0.40 2024-06-28 15:22:22 +08:00
James Feng Cao
8367164d73 ebrowser v1.0.39 2024-06-28 14:24:17 +08:00
James Feng Cao
ad1d9e33b7 ebrowser v1.0.38 2024-06-28 09:48:56 +08:00
James Feng Cao
c00e3a1f09 ebrowser v1.0.37 2024-06-27 20:10:33 +08:00
James Feng Cao
725917a939 ebrowser v1.0.35 2024-06-26 09:14:24 +08:00
James Feng Cao
c60d325354 ebrowser: provide example mapkeys.json 2024-06-25 06:33:05 +08:00
James Feng Cao
895c3124f9 ebrowser v1.0.34 2024-06-25 06:30:40 +08:00
James Feng Cao
1577313e59 ebrowser 1.0.33 2024-06-25 06:06:51 +08:00
James Feng Cao
536ff07ffa move ebrowser README together with package files 2024-06-24 10:43:03 +08:00
James Feng Cao
d28fe3eed2 ebrowser to use alt+<- / -> for page backward/forward 2024-06-24 09:58:02 +08:00
James Feng Cao
052cb9dad1 ebrowser 1.0.29 2024-06-19 22:41:21 +08:00
James Feng Cao
9acd6f4a24 add search.json 2024-06-19 21:58:58 +08:00
James Feng Cao
2e2b048336 ebrowser 1.0.27 2024-06-19 15:48:13 +08:00
James Feng Cao
17932d8843 ebrowser 1.0.26 2024-06-19 15:25:23 +08:00
James Feng Cao
e29bf0538d fix typos 2024-06-19 07:00:19 +08:00
James Feng Cao
7990d17849 ebrowser v1.0.23 2024-06-19 06:36:48 +08:00
James Feng Cao
070d64e7e2 complete ebrowser app update 2024-06-18 23:45:21 +08:00
James Feng Cao
c3173e0f97 support ebrowser update 2024-06-18 23:28:12 +08:00
James Feng Cao
5f2116943f fix typos 2024-06-18 11:14:25 +08:00
James Feng Cao
eba6f63b7f ebrowser updates 2024-06-18 10:41:17 +08:00
James Feng Cao
2cc5b79da4 updates ebrowser 2024-06-15 11:36:06 +08:00
James Feng Cao
d0d745b7f5 updates bookmarklets 2024-06-13 08:07:31 +08:00
James Feng Cao
7eccedfecc adaptable ebrowser links 2024-06-11 18:42:38 +08:00
James Feng Cao
8eb8e9e41f fix ebrowser link 2024-06-10 17:31:31 +08:00
James Feng Cao
d2bab81cbb more AI engines 2024-06-10 11:29:04 +08:00
James Feng Cao
b2fb3b0d3c README update 2024-06-10 10:31:17 +08:00
James Feng Cao
45cce01aaa add instructions for ebrowser installation 2024-06-06 10:29:25 +08:00
James Feng Cao
b3dbc53138 add windows/macos/linux support 2024-06-03 10:48:11 +08:00
James Feng Cao
81c65f4beb add windows/macos/linux support 2024-06-03 10:43:25 +08:00
James Feng Cao
54c5b4cb51 add windows/macos/linux support 2024-06-03 10:42:09 +08:00
James Feng Cao
9bb616264f add windows/macos/linux support 2024-06-03 10:28:04 +08:00
James Feng Cao
cad15caa9a selection menu: notems for cloud sharing 2024-05-24 09:44:51 +08:00
James Feng Cao
561c618cf6 revert back selection menu: netcut 2024-05-23 16:34:04 +08:00
James Feng Cao
4844f0cb42 add selection menu netcut for cloud sharing 2024-05-23 15:45:56 +08:00
James Feng Cao
a4c5482286 update tiangong AI 2024-05-20 11:30:05 +08:00
James Feng Cao
a36d892846 add eweb for Windows, MacOS and Linux 2024-05-19 22:31:23 +08:00
James Feng Cao
e16ae4bfd9 enhance latest.html 2024-05-07 09:30:31 +08:00
James Feng Cao
a0f510ca9a readme update 2024-05-06 08:41:51 +08:00
James Feng Cao
5f260a728d fix downloading failure for a few sites 2024-05-05 18:17:42 +08:00
James Feng Cao
f75b1ed6f2 associate bookmark file to search engine file if file names only differ in extensions 2024-04-30 20:54:17 +08:00
James Feng Cao
0d2f4adee1 enhance i:0m to support negative uplevel 2024-04-30 14:38:08 +08:00
James Feng Cao
f61e10f836 update bookmarks 2024-04-20 09:20:00 +08:00
James Feng Cao
0dc5a32fa4 add force encoding support for sites with wrong encodings 2024-04-19 16:11:12 +08:00
James Feng Cao
e7c63d0df2 add more AI engines 2024-04-18 15:14:13 +08:00
James Feng Cao
94cc23df0a fix typos 2024-04-08 20:24:06 +08:00
James Feng Cao
b4c443b85c add associated bookmarks 2024-04-08 09:01:20 +08:00
James Feng Cao
271c6b869d add atomgit pages 2024-04-07 10:02:50 +08:00
James Feng Cao
851d92a3b6 add atomgit pages 2024-04-07 10:02:12 +08:00
James Feng Cao
d1b5317474 update mirrors 2024-04-05 16:22:25 +08:00
James Feng Cao
7ebb517e24 version 1042 2024-04-04 21:28:55 +08:00
James Feng Cao
93cccb211b add copyright notice 2024-04-03 09:47:35 +08:00
James Feng Cao
ed565d9960 update mirrors 2024-04-02 19:38:45 +08:00
James Feng Cao
75cb8c0c1e cleanup README 2024-04-02 14:09:11 +08:00
James Feng Cao
21e0757831 reorg 2024-04-02 13:42:43 +08:00
James Feng Cao
4b66fe2881 update mirrors 2024-04-02 09:39:01 +08:00
James Feng Cao
b7b4361758 fix links for tags 2024-04-01 21:51:55 +08:00
James Feng Cao
8e88f74c4e remove mirrors 2024-04-01 11:18:05 +08:00
James Feng Cao
ed527c7bf1 add metaso.cn 2024-03-31 11:33:16 +08:00
James Feng Cao
922481d142 add metaso chatbot 2024-03-29 10:32:37 +08:00
James Feng Cao
f8c5a9312e add 360AI & tiangong chatbots 2024-03-29 10:18:02 +08:00
James Feng Cao
f86d763d67 add notes for search engine file format 2024-03-25 11:06:58 +08:00
James Feng Cao
67b2f74f41 update mirror repository links 2024-03-25 08:27:16 +08:00
James Feng Cao
1fa57a6ca4 update repositories 2024-03-24 11:50:35 +08:00
James Feng Cao
0ecceefb88 update repositories 2024-03-24 11:44:40 +08:00
James Feng Cao
fa8bedbedb fix README links 2024-03-24 09:47:50 +08:00
James Feng Cao
ee1356f7d0 fix README links 2024-03-24 09:42:35 +08:00
James Feng Cao
5442aa85ef fix README links 2024-03-24 09:39:48 +08:00
James Feng Cao
36008d74e6 fix mirror links 2024-03-24 08:50:22 +08:00
James Feng Cao
0b0584e39d add more AI chatbot as search engines 2024-03-23 16:59:54 +08:00
James Feng Cao
1502209acb README update 2024-03-23 16:13:29 +08:00
James Feng Cao
b9d6b27bee add XunFei xinghuo chatbot as search engine 2024-03-23 15:57:06 +08:00
James Feng Cao
af87a9130d fix redirect.html 2024-03-23 11:38:38 +08:00
James Feng Cao
c0a6690dd8 hugo to use relative path 2024-03-23 10:50:14 +08:00
James Feng Cao
d4d932689d README link fix 2024-03-22 17:36:11 +08:00
James Feng Cao
b65e9b48ca fix links in README for websites 2024-03-22 16:51:20 +08:00
James Feng Cao
0a5707bb0d revert back README w/o frontmatter 2024-03-22 16:37:51 +08:00
James Feng Cao
4aceddcd7c add frontmatter in README 2024-03-22 16:12:03 +08:00
James Feng Cao
1106e4b018 README visitable in all cases 2024-03-22 11:47:19 +08:00
James Feng Cao
f84f7442eb add repositories to mirrors.md 2024-03-22 10:46:37 +08:00
James Feng Cao
c2174435e7 fix extra mirror links in README 2024-03-22 10:21:38 +08:00
James Feng Cao
d9497853ad fix README 2024-03-22 09:29:33 +08:00
James Feng Cao
b4ceca9041 fix README 2024-03-22 09:12:29 +08:00
James Feng Cao
534cf21eb0 add mirrors.md 2024-03-22 09:10:12 +08:00
James Feng Cao
5c230a12c2 version 1038 to support chatBots as search engines 2024-03-21 17:56:09 +08:00
James Feng Cao
94dedf19c6 remove gitee commenting 2024-03-21 09:04:37 +08:00
James Feng Cao
7d1b8278b9 fix gitee commenting 2024-03-21 08:35:08 +08:00
James Feng Cao
1744d90c59 update READEME 2024-03-20 08:39:14 +08:00
James Feng Cao
e381ccbf2d update READEME 2024-03-17 14:14:14 +08:00
James Feng Cao
2e6ca5bed4 add deno site 2024-03-17 13:55:46 +08:00
James Feng Cao
8199f16d10 fix deno.js to deploy static site 2024-03-17 13:42:27 +08:00
James Feng Cao
6e8ede8dd8 fix deno.js to deploy static site 2024-03-17 13:31:45 +08:00
James Feng Cao
9f8edef028 deno.js to deploy static site 2024-03-17 12:23:44 +08:00
James Feng Cao
22277c08c3 add global redirection example 2024-03-17 10:36:18 +08:00
James Feng Cao
68fa9617be make config.js robust 2024-03-10 13:14:14 +08:00
James Feng Cao
a894ae8777 fix config.js chinese version 2024-03-10 11:25:42 +08:00
James Feng Cao
f308403a3e optimize config.js 2024-03-10 10:59:50 +08:00
James Feng Cao
9628d3785f add google search deno mirror 2024-03-08 14:44:37 +08:00
James Feng Cao
fff6341182 add deno deploy url 2024-03-07 17:01:23 +08:00
James Feng Cao
e51739f1be add global redirection with deno 2024-03-05 17:47:46 +08:00
James Feng Cao
6433faf02d add zeabur 2024-03-04 11:03:48 +08:00
James Feng Cao
ddd20f6bc8 remove build.gradle 2024-03-04 10:25:39 +08:00
James Feng Cao
a83084f300 add AI search engines 2024-02-26 20:08:08 +08:00
James Feng Cao
a0e5977a59 add AI engines 2024-02-04 22:38:28 +08:00
James Feng Cao
892c611c60 termux.boot to make crontab valid after OS rebooting 2024-01-04 18:15:25 +08:00
James Feng Cao
e4962ac9fb version 1037: enhance andvanced configuration 2023-12-19 17:16:21 +08:00
James Feng Cao
bf47ae2390 latest.html works for all cases 2023-12-18 18:02:48 +08:00
James Feng Cao
6db5a47d1a latest.html works for all cases 2023-12-18 16:42:36 +08:00
James Feng Cao
515787c68d fix genApk() 2023-12-11 18:55:49 +08:00
James Feng Cao
a494f53d9a fix update checking links 2023-12-11 17:04:15 +08:00
James Feng Cao
8a811bf2e4 fix update checking links 2023-12-11 16:49:57 +08:00
James Feng Cao
df638a8b49 remove rss button 2023-12-11 16:34:00 +08:00
James Feng Cao
7dfc274768 change 'site map' to 'configuration' 2023-12-11 16:15:51 +08:00
James Feng Cao
225fd5c802 add RSS 2023-12-11 15:23:07 +08:00
James Feng Cao
951d607c7c 'engine.search' reused as live TV channel urls 2023-12-09 17:53:37 +08:00
James Feng Cao
faeac627be version 1035 2023-12-06 19:56:12 +08:00
James Feng Cao
809dd08489 add i:0/js/ support 2023-12-06 09:45:57 +08:00
James Feng Cao
9edd84c037 add i:0/js/ support 2023-12-06 09:06:02 +08:00
James Feng Cao
dec6cd1ab9 remove i:5g links 2023-12-05 08:58:02 +08:00
James Feng Cao
3715fd6cb5 1034: enhancing share button for clipboard text processing 2023-12-03 11:16:31 +08:00
James Feng Cao
5979fc0d80 sync README.zh.md 2023-12-01 16:29:35 +08:00
James Feng Cao
ac37de825e rename pccopy to textprocess 2023-12-01 16:09:30 +08:00
James Feng Cao
7adfd0f544 version 1032 2023-12-01 10:42:31 +08:00
James Feng Cao
914d1cfca2 update to version 1031 2023-11-28 22:07:15 +08:00
James Feng Cao
9f3fdb6d20 1030: allow downloading with global redirection 2023-11-28 16:01:09 +08:00
James Feng Cao
d15c4e25d0 1029: allow share huge images 2023-11-24 08:10:29 +08:00
James Feng Cao
8393f2652c add crontab example to sign in automatically 2023-11-23 11:33:46 +08:00
James Feng Cao
12b3563708 add crontab example to sign in automatically 2023-11-23 10:08:41 +08:00
James Feng Cao
36182a2a88 enhance security 2023-11-21 16:23:28 +08:00
James Feng Cao
4039a5b8ec 8x file saving performance improvement 2023-11-21 10:53:50 +08:00
James Feng Cao
1234ce175a test automation: scripting mode for i:0 urls 2023-11-14 13:22:15 +08:00
James Feng Cao
fa884c32a7 update to version 1025 2023-11-14 08:42:56 +08:00
James Feng Cao
b8d5451d77 latest version: 1022 2023-11-05 22:24:17 +08:00
James Feng Cao
1ae8341d4a enhance internal links 2023-11-04 21:01:19 +08:00
James Feng Cao
301b52f556 remove :002 2023-11-04 19:43:06 +08:00
James Feng Cao
139cf75218 test automation scripting support 2023-11-04 08:02:46 +08:00
James Feng Cao
a511f972c8 . 2023-11-02 11:17:18 +08:00
James Feng Cao
0a4c6a9474 . 2023-11-02 11:04:16 +08:00
James Feng Cao
8fcac14ac0 . 2023-11-02 11:02:30 +08:00
James Feng Cao
b17aaf4116 . 2023-11-02 10:57:14 +08:00
James Feng Cao
bfb5e7c079 . 2023-11-02 10:39:16 +08:00
James Feng Cao
f88fab17b2 . 2023-11-02 09:51:06 +08:00
James Feng Cao
8e42c8b7ac enhance crontab support 2023-10-30 23:43:08 +08:00
James Feng Cao
63eee8ebb5 'am broadcast' to execute internal links 2023-10-28 20:37:53 +08:00
James Feng Cao
e42712c71a the sixth field of crontab to support internal links 2023-10-26 19:01:39 +08:00
James Feng Cao
074affaa54 internal links as sixth field in crontab 2023-10-26 07:37:29 +08:00
James Feng Cao
8c6754186c add crontab support as alarm clock 2023-10-25 13:09:25 +08:00
James Feng Cao
1fb143ab1b add charset to config.html 2023-09-15 15:42:00 +08:00
James Feng Cao
437fc7a2b4 fix note taking menu 2023-09-08 15:16:23 +08:00
James Feng Cao
f93cedd1dd address bar to work better with more input methods 2023-08-20 15:00:30 +08:00
James Feng Cao
6304d5594a update termux doc 2023-08-20 09:20:24 +08:00
James Feng Cao
3239bb8dec update termux doc 2023-08-20 09:11:48 +08:00
James Feng Cao
33d2db03b7 use redirect for bingAI 2023-07-18 10:54:53 +08:00
James Feng Cao
a2c2729725 update README.zh.md 2023-07-05 12:19:39 +08:00
James Feng Cao
940df7475f add muweb.cyclic.app 2023-07-05 09:11:58 +08:00
James Feng Cao
58edc855cd add muweb.cyclic.app 2023-07-05 09:10:06 +08:00
James Feng Cao
ef45cb87c9 add toolbar autohide 2023-06-28 18:28:29 +08:00
James Feng Cao
2c2f15bfa9 redirect bingai to cloudflare challenge if needed 2023-06-19 20:55:00 +08:00
James Feng Cao
63077ffe8f adjust latest.html 2023-06-17 19:39:06 +08:00
James Feng Cao
f736bbfd88 add i:8d[url] to force downloading 2023-06-17 16:03:34 +08:00
James Feng Cao
a548a5d8a5 minor adjust for updates checking 2023-06-17 11:58:51 +08:00
James Feng Cao
57dc4d61f8 add updates checking 2023-06-17 11:21:08 +08:00
James Feng Cao
3a3118c61a add link to check for updates 2023-06-17 09:56:11 +08:00
James Feng Cao
fbf6635c1a adjust mirror order in README 2023-06-12 10:36:13 +08:00
James Feng Cao
21600e4acf update README 2023-06-07 17:46:25 +08:00
James Feng Cao
6aab9abf2c add long screenshot mode 2023-06-05 08:30:00 +08:00
James Feng Cao
c533099e82 add long screenshot mode 2023-06-05 07:58:25 +08:00
James Feng Cao
840fca625b auto reload after configuration save 2023-06-02 10:44:29 +08:00
James Feng Cao
08959823db Advanced customization configuration to auto reload after changes 2023-06-02 10:07:46 +08:00
James Feng Cao
88c107828b enhance url bundles i:1b with callback 2023-06-01 21:46:11 +08:00
James Feng Cao
7d27ea2485 config: add downloadpath 2023-06-01 16:22:41 +08:00
James Feng Cao
7f43a7d7d4 update bingAI api 2023-05-29 21:01:22 +08:00
James Feng Cao
d43d3e3dfc add udrop 2023-05-26 15:48:51 +08:00
James Feng Cao
f536c6eb78 bingAI always uses magicUrl for wss:// 2023-05-24 22:58:18 +08:00
James Feng Cao
a1f7adb7f0 revert bing.js changes 2023-05-24 21:53:27 +08:00
James Feng Cao
594fcf767d simplify bing.js 2023-05-24 21:45:46 +08:00
James Feng Cao
087b9df6b6 enhance default.select with clipboard output 2023-05-23 16:43:54 +08:00
James Feng Cao
a8700372f4 update bingAI api 2023-05-19 15:09:14 +08:00
James Feng Cao
2d72f7825a add link to magic urls 2023-05-13 20:12:55 +08:00
James Feng Cao
7e7871f764 fix en/cmds 2023-05-12 14:05:43 +08:00
James Feng Cao
54c1db0255 fix bingAI draw 2023-05-10 09:02:04 +08:00
James Feng Cao
f8529dc7de fix bingAI draw 2023-05-10 07:29:46 +08:00
James Feng Cao
eb328d7609 add bingAI image creator 2023-05-09 23:00:28 +08:00
James Feng Cao
a413b5f1d0 add bingAI draw 2023-05-09 21:56:08 +08:00
James Feng Cao
e4906dfd26 add gissues 2023-05-09 11:11:05 +08:00
James Feng Cao
78552b5e5a add 4everland 2023-05-08 08:54:03 +08:00
James Feng Cao
d082e9cf5b add 4everland 2023-05-07 23:25:05 +08:00
James Feng Cao
56a0c2f36f add giscus to all mirrors 2023-05-06 10:49:29 +08:00
James Feng Cao
a9bdb08c77 add giscus 2023-05-06 09:56:44 +08:00
James Feng Cao
dfc14dae10 add giscus 2023-05-06 09:40:28 +08:00
James Feng Cao
398ba8c89a add google translate bookmarklets 2023-04-29 21:48:40 +08:00
James Feng Cao
e9ecf66872 add google translate bookmarklets 2023-04-29 21:12:12 +08:00
James Feng Cao
99f6e7d2c7 local bookmarklets to support CSP sites 2023-04-29 19:24:02 +08:00
James Feng Cao
bef3445154 add test/alert.js 2023-04-29 17:47:59 +08:00
James Feng Cao
830c97bf91 encoding '+' in links 2023-04-29 15:01:22 +08:00
James Feng Cao
64224d5cc6 minor changes 2023-04-29 14:29:14 +08:00
James Feng Cao
6e30989d56 add google translate menus 2023-04-29 14:05:37 +08:00
James Feng Cao
df40846eb5 add google translate menus 2023-04-29 13:54:40 +08:00
James Feng Cao
fc717a7c90 add google translate menus 2023-04-29 13:37:17 +08:00
James Feng Cao
50c0037c97 fix google translate in censored area 2023-04-29 13:08:57 +08:00
James Feng Cao
9f7bb0ba52 add google translate for censored area 2023-04-29 12:17:33 +08:00
James Feng Cao
c2b605ec3b reorg tips 2023-04-27 23:24:59 +08:00
James Feng Cao
a3dc816f34 link changes in config.html 2023-04-27 09:24:01 +08:00
James Feng Cao
7a254b0d0e add .codechina-ci.yml 2023-04-26 17:55:46 +08:00
James Feng Cao
ae108ac8bb bingAI fix 2023-04-25 22:28:16 +08:00
James Feng Cao
ad4cc42d67 bingAI fix 2023-04-25 19:34:37 +08:00
James Feng Cao
8f2c1c9ad0 bingAI fix 2023-04-25 19:08:18 +08:00
James Feng Cao
6ae4b1bb30 load .js files under 'css' folder at earliest time 2023-04-20 10:23:42 +08:00
James Feng Cao
b21c1074d7 support bundled installation 2023-04-18 16:08:42 +08:00
James Feng Cao
acef3cbd59 add mimetype uwebA 2023-04-17 11:23:49 +08:00
James Feng Cao
d71ea8e173 add mimetype uwebA 2023-04-17 11:15:40 +08:00
James Feng Cao
c29eb47b8b add bingWrite 2023-04-17 07:28:21 +08:00
James Feng Cao
5951fe139a refine bingWrite UI 2023-04-16 17:05:06 +08:00
James Feng Cao
cad6049847 add bingWrite UI 2023-04-16 16:26:24 +08:00
James Feng Cao
6f832ad3d9 sync bingAI 2023-04-15 22:05:31 +08:00
James Feng Cao
8ea7d1e5a9 sync bingAI 2023-04-15 21:43:30 +08:00
James Feng Cao
577cf5c6f6 sync bingAI 2023-04-15 20:50:39 +08:00
James Feng Cao
a81920a1a5 enhance redirection cookie support 2023-04-15 20:12:02 +08:00
James Feng Cao
18b9609a23 add option: 'forward cookies' 2023-04-14 16:06:13 +08:00
James Feng Cao
ed25fd1dd7 simplify bingAI installation 2023-04-13 11:13:46 +08:00
James Feng Cao
a7caf970e6 update global redirection docs 2023-04-12 13:56:43 +08:00
James Feng Cao
2704b2f1cc fix config.js completely 2023-04-12 13:16:15 +08:00
James Feng Cao
032723db19 use innerHTML in config.js 2023-04-12 10:55:29 +08:00
James Feng Cao
1239ef166c use outerHTML in config.js 2023-04-12 10:34:12 +08:00
James Feng Cao
13fbe1c9af use view-source: in config.js 2023-04-12 10:25:48 +08:00
James Feng Cao
0e70132833 minor typos 2023-04-12 09:52:15 +08:00
James Feng Cao
8998d08b42 bingAI: add optionsSet.js 2023-04-12 09:39:41 +08:00
James Feng Cao
1ba51cb179 minor typos 2023-04-12 08:30:25 +08:00
James Feng Cao
e35f094c97 add global redirect url support 2023-04-12 08:07:52 +08:00
James Feng Cao
96b13242b5 add global redirect url support 2023-04-12 07:40:52 +08:00
James Feng Cao
668562f292 adapt bingChatHub.js 2023-04-10 22:30:26 +08:00
James Feng Cao
cb565e5567 enhance :0cc cookie copy 2023-04-10 08:23:51 +08:00
James Feng Cao
6a726e893c add deno/bing.js 2023-04-07 21:38:56 +08:00
James Feng Cao
441db3a1f4 add workers for bingAI 2023-04-07 18:07:09 +08:00
James Feng Cao
95c5410f00 hosts to support both ip address and response headers 2023-04-07 15:32:34 +08:00
James Feng Cao
e8b5f412f0 bingAI: use https://mybing2.xn--xyza.top as default 2023-04-07 14:43:41 +08:00
James Feng Cao
9ea6258d40 bingAI: revert back bing.js change 2023-04-06 23:34:50 +08:00
James Feng Cao
c9f0db1c34 bingAI: minor optimization 2023-04-06 23:26:29 +08:00
James Feng Cao
3672627e81 bingAI: remove chatmessages.js 2023-04-06 17:20:51 +08:00
James Feng Cao
bfa1a68ed2 bingAI: completed 2023-04-06 09:05:34 +08:00
James Feng Cao
2ac6107614 fix typos 2023-04-05 12:09:09 +08:00
James Feng Cao
74511d89e0 simplify bingAI 2023-04-04 21:09:06 +08:00
James Feng Cao
e3f545c03f simplify bingAI 2023-04-04 20:43:47 +08:00
James Feng Cao
fcc8fe4f5e update bingAI 2023-04-04 16:03:14 +08:00
James Feng Cao
89edcd3d46 bingAI: supports cors with cookies 2023-04-04 14:51:30 +08:00
James Feng Cao
a853a7bb2b add option to disable gestures for volumn & ligntness 2023-04-03 21:06:19 +08:00
James Feng Cao
ed2b96f46c bingAI: supports cors with cookies 2023-04-03 17:51:28 +08:00
James Feng Cao
37e1fae65a add enhanced hosts support to README 2023-04-03 09:13:07 +08:00
James Feng Cao
ed7de221d0 enhance hosts to add attributes for domains 2023-04-03 08:22:41 +08:00
James Feng Cao
23e9a9179d bingAI: avoid gitee for js issues 2023-04-02 20:54:32 +08:00
James Feng Cao
50f156dc6b bingAI: avoid gitee css mimetype issue, and repo utf issue for js files 2023-04-02 20:35:35 +08:00
James Feng Cao
e20a424290 update bing.html 2023-04-02 11:33:29 +08:00
James Feng Cao
cd7f1f9cea minor changes in tips 2023-04-02 10:39:13 +08:00
James Feng Cao
b01672cb48 refine bingAI UI 2023-04-02 09:52:12 +08:00
James Feng Cao
25bb54f62c add config for bingChat UI 2023-04-01 23:40:13 +08:00
James Feng Cao
c8a8b0214f add config for bingChat UI 2023-04-01 23:34:44 +08:00
James Feng Cao
9ec7186e34 add bingChat UI for censored area 2023-04-01 21:07:20 +08:00
James Feng Cao
5dcba20904 use [ipv6] in hosts 2023-04-01 15:15:10 +08:00
James Feng Cao
62f3a10994 domain changes 2023-03-30 21:42:36 +08:00
James Feng Cao
4f5a15cb23 domain changes 2023-03-30 21:08:09 +08:00
James Feng Cao
7146aff7c9 add Encrypted Client Hello (ECH) support for hosts 2023-03-30 16:47:03 +08:00
James Feng Cao
8741779b66 refine hosts supports 2023-03-23 22:46:40 +08:00
James Feng Cao
5b3b3fe5d1 supports ctrl-a to ctrl-z with i:56 urls 2023-03-22 19:03:02 +08:00
James Feng Cao
9dc075503b supports hosts 2023-03-21 13:34:59 +08:00
James Feng Cao
4e8ff416e7 supports hosts 2023-03-20 22:31:36 +08:00
James Feng Cao
ddc9c8c16d supports hosts for local domain name resolving 2023-03-20 11:57:14 +08:00
James Feng Cao
2817b68a19 newbing for censored area with super bookmarks 2023-03-16 15:49:27 +08:00
6acc1ed1aa Update .gitlab-ci.yml 2023-03-15 00:30:54 +00:00
James Feng Cao
cb2324e4c2 newbing for censored area with super bookmarks 2023-03-14 18:53:00 +08:00
James Feng Cao
925e3f6299 superbookmark to use newbing from censored area 2023-03-14 11:02:46 +08:00
James Feng Cao
decb1cf49e superbookmark to use newbing from censored area 2023-03-14 10:18:41 +08:00
James Feng Cao
400048f1d9 superbookmark to use newbing from censored area 2023-03-14 10:02:25 +08:00
James Feng Cao
56efdbbe18 superbookmark to use newbing from censored area 2023-03-14 08:25:50 +08:00
James Feng Cao
cd0754d0ff add bingChat tips 2023-03-13 21:38:48 +08:00
James Feng Cao
0c9c73951d add bingChat 2023-03-12 22:09:00 +08:00
James Feng Cao
be15410d97 add donation link 2023-03-09 06:37:11 +08:00
James Feng Cao
6f2aa9ea4d add uweb.epizy.com 2023-03-08 20:37:51 +08:00
James Feng Cao
3e389ad454 newbing for censored area 2023-03-08 15:29:31 +08:00
James Feng Cao
024fa60e19 newbing support with more explanation 2023-03-08 12:31:39 +08:00
James Feng Cao
75faa15b83 newbing support 2023-03-07 13:36:52 +08:00
James Feng Cao
a6aabed862 add revision history 2023-03-07 10:07:05 +08:00
James Feng Cao
425e0c74d1 refine newbing 2023-03-06 11:37:59 +08:00
James Feng Cao
673e457978 bingUS engine could be default 2023-03-06 07:21:18 +08:00
James Feng Cao
57a397d7a3 bingUS engine could be default 2023-03-06 06:46:51 +08:00
James Feng Cao
71c2987cf9 optimize bingUS engine 2023-03-05 21:07:47 +08:00
James Feng Cao
94bf28a6ba simple modification info 2023-03-05 11:17:42 +08:00
James Feng Cao
e7afdd0dae simple modification info 2023-03-05 11:14:49 +08:00
James Feng Cao
e50056c68d append simpe modification info 2023-03-05 11:12:05 +08:00
James Feng Cao
e6f0ef87e5 add charset for advanced config 2023-03-04 22:17:12 +08:00
James Feng Cao
d6a016d487 add modified dates 2023-03-04 18:22:18 +08:00
James Feng Cao
e367af94be supports new bing (chatgpt) 2023-03-04 10:56:24 +08:00
James Feng Cao
457e012713 enhance user defined extra http request headers 2023-03-04 09:43:13 +08:00
James Feng Cao
0d9d30d783 supports user defined extra http request headers 2023-03-04 06:57:28 +08:00
James Feng Cao
b0147c8c85 refine markdeep.html 2023-02-25 11:46:02 +08:00
James Feng Cao
8fde5df446 use relative path 2023-02-20 22:03:43 +08:00
James Feng Cao
cd12841352 add markdeep styling for bookmarks 2023-02-17 21:11:35 +08:00
James Feng Cao
1ed0b0c7ca styling bookmark, markdown or other files 2023-02-16 14:20:01 +08:00
James Feng Cao
5838a014cf add 'More bookmarks' menu to apply css styling 2023-02-14 23:07:43 +08:00
James Feng Cao
c124197dbe use relative path 2023-02-14 16:55:34 +08:00
James Feng Cao
e7700877a8 Multiple type profiles: switch any data including website logins, user configurations orthogonally. 2023-02-13 16:11:39 +08:00
James Feng Cao
3b6a36a2fa Add profile switching for user configurations/http auth etc. 2023-02-12 22:03:54 +08:00
James Feng Cao
d4bc203492 fix README links 2023-02-04 11:21:53 +08:00
James Feng Cao
0d1241bec5 multiple links support for single menu/(new)button/gesture definition 2023-02-03 17:06:25 +08:00
James Feng Cao
8d64d0ede0 add perplexity.ai 2023-02-01 22:29:25 +08:00
James Feng Cao
af3cad969b add UI config link 2023-02-01 10:39:40 +08:00
James Feng Cao
491856eb1f add menu for selection: search with home screen 2023-01-31 19:54:36 +08:00
James Feng Cao
6c53b64adf add menu for selection: search with home screen 2023-01-31 19:40:46 +08:00
James Feng Cao
668af3d194 fix generated apk path 2023-01-31 09:35:45 +08:00
James Feng Cao
bc8110325b fix broken links 2023-01-31 09:19:11 +08:00
James Feng Cao
7399d1b5cd add links to README 2023-01-30 12:44:53 +08:00
James Feng Cao
f5d2345718 README update 2023-01-29 19:19:15 +08:00
James Feng Cao
287897b960 preprocessing before rendering with siteextra 2023-01-28 09:52:52 +08:00
James Feng Cao
612af3a880 preprocessing before rendering with siteextra 2023-01-28 09:41:12 +08:00
James Feng Cao
349e7e629d fix errors for siteextra 2023-01-28 08:40:29 +08:00
James Feng Cao
3eacdfbe86 siteextra to support site source html preprocessing before rendering 2023-01-27 09:57:17 +08:00
James Feng Cao
7c38fa2615 add webdav cloud storage support for upload, backup/restore, delete, mkcol 2023-01-22 17:27:29 +08:00
James Feng Cao
53d34196b6 webdav/http file upload support 2023-01-19 17:38:17 +08:00
James Feng Cao
b3d7263d59 webdav/http file upload support 2023-01-19 17:29:17 +08:00
James Feng Cao
a3147eaa1a webdav/http file upload support 2023-01-19 17:24:07 +08:00
James Feng Cao
3ecbea5097 fix backup.html 2023-01-18 20:48:03 +08:00
James Feng Cao
632302bd68 use .search file as bookmarks to auto login 2023-01-16 22:35:51 +08:00
James Feng Cao
472a62a35b apply same folder home.css to search engines 2023-01-16 22:25:09 +08:00
James Feng Cao
36012141dd address bar: support ! command line 2023-01-14 17:19:47 +08:00
James Feng Cao
77a7fc60be update README 2023-01-13 18:00:48 +08:00
James Feng Cao
b96d51b85d enhance web.js for ':! ' 2023-01-12 16:28:30 +08:00
James Feng Cao
d05e18ea53 add more search engines 2023-01-12 09:45:05 +08:00
James Feng Cao
db629abf0f address bar: :! command line doc 2023-01-09 08:03:02 +08:00
James Feng Cao
cd87cc793c address bar: :! to add example command line file web.js & web.sh 2023-01-08 19:59:57 +08:00
James Feng Cao
aeec3960f5 :! support for .sh files 2023-01-08 09:16:44 +08:00
James Feng Cao
92b697afe2 option to keep playing audio when screen off 2023-01-06 21:58:00 +08:00
James Feng Cao
e45e124b2a add :! command line support, js file as command line executable 2023-01-06 13:19:45 +08:00
James Feng Cao
738ded93be add :! command line support, js file as command line executable 2023-01-06 13:18:15 +08:00
James Feng Cao
035797ab60 add video urls 2023-01-03 16:52:58 +08:00
James Feng Cao
e76d93f0d1 add video urls 2023-01-03 16:51:01 +08:00
James Feng Cao
dca1cb1170 google translation: revert to non-hack 2022-12-17 16:57:01 +08:00
James Feng Cao
f6d1022757 enhance config.js 2022-12-16 17:48:23 +08:00
James Feng Cao
75546688a1 addressbar: auto hide 2022-12-16 09:21:18 +08:00
James Feng Cao
e9f6a03637 support: custo pdf export and long vector screenshot 2022-12-12 12:23:02 +08:00
James Feng Cao
ed6f827379 Address bar: ':p [width]x[height im milliinch]' 2022-12-11 09:23:44 +08:00
James Feng Cao
732adfa362 generate PDF for custom paper size 2022-12-08 16:15:22 +08:00
James Feng Cao
b0aaa72b31 use relative path template for backup.html 2022-11-25 13:25:29 +08:00
James Feng Cao
68014621bb add ddns support 2022-11-24 08:32:31 +08:00
James Feng Cao
79f9980fb5 add ddns support 2022-11-23 13:52:03 +08:00
James Feng Cao
71fb1c09eb add POST bookmarks (with secrets) 2022-11-18 13:49:57 +08:00
James Feng Cao
439cf52e37 enhance multiple home screens UI 2022-11-17 15:12:59 +08:00
James Feng Cao
8a502e4532 add multiple home screens support for .mht files 2022-11-17 09:10:03 +08:00
James Feng Cao
228a6ea84c multiple home screens to support .mht files 2022-11-16 23:16:30 +08:00
James Feng Cao
1a202f5bfc add smiles2structure bookmark 2022-11-13 20:51:09 +08:00
James Feng Cao
7b4e088180 readme change 2022-11-11 10:15:39 +08:00
James Feng Cao
cfd4961502 add more academic search engines 2022-11-11 09:09:24 +08:00
James Feng Cao
8e7b56a157 i:0m to support local file 2022-11-08 11:06:46 +08:00
James Feng Cao
ec4d107f65 i:0m to support local file 2022-11-08 09:51:57 +08:00
James Feng Cao
7765bb0ccb rebuilding Tue Nov 8 09:51:19 AM CST 2022 2022-11-08 09:51:19 +08:00
James Feng Cao
4d933cd0fe add flg for not following sys night mode 2022-11-06 14:38:10 +08:00
James Feng Cao
7b97504629 style.css adaptable for all kind of sites 2022-10-31 15:48:14 +08:00
James Feng Cao
f7374ef3b7 style.css adaptable for all kind of sites 2022-10-31 15:44:05 +08:00
James Feng Cao
e1bebd1fdd fix style.css 2022-10-31 15:28:14 +08:00
James Feng Cao
64ee36ca58 add more search engines 2022-10-29 16:14:47 +08:00
James Feng Cao
4a71bfda3b remove CORS doc 2022-10-27 10:08:38 +08:00
James Feng Cao
d559a9b550 add netcut.cn 2022-10-26 23:25:11 +08:00
James Feng Cao
46de690e7b add CSP & CORS white list support 2022-10-26 23:19:54 +08:00
James Feng Cao
8bb1645e7c add CSP & CORS white list support 2022-10-26 22:43:36 +08:00
James Feng Cao
2d016e3fdb add web extension support 2022-10-22 06:47:01 +08:00
James Feng Cao
939b257389 adjust UI links in sitemap 2022-10-21 15:22:54 +08:00
James Feng Cao
c0e90a6090 enable html5 apps from sitecache/local 2022-10-21 09:45:05 +08:00
James Feng Cao
3cb1a66d80 add md+katex huge txt viewer 2022-10-20 17:04:24 +08:00
James Feng Cao
1ca754c378 serverless local sites 2022-10-19 23:10:42 +08:00
James Feng Cao
89b2e24890 i:6i to use existing tab for the same url with different url hash 2022-10-17 23:23:29 +08:00
James Feng Cao
7eddea74b8 add search engines 2022-10-17 08:01:26 +08:00
James Feng Cao
9038a9df17 fix type 2022-10-16 11:45:18 +08:00
James Feng Cao
073f5f94c3 add mdict scanning bookmark 2022-10-16 11:41:23 +08:00
James Feng Cao
3d6951e99a add command bookmarks 2022-10-15 08:55:26 +08:00
James Feng Cao
a79d00b323 add command bookmarks 2022-10-15 08:47:23 +08:00
James Feng Cao
c408fd8407 more doc for mdict engines 2022-10-13 16:24:40 +08:00
James Feng Cao
b5462e600b add doc for mdict engines 2022-10-13 16:17:19 +08:00
James Feng Cao
22d028d2dd add option for webview debug 2022-10-13 15:44:47 +08:00
James Feng Cao
708290b421 mdict: fix selectize css path 2022-10-13 15:27:00 +08:00
James Feng Cao
b4cd28c645 mdict: support css 2022-10-13 08:39:50 +08:00
James Feng Cao
ad2ad04b47 html5 app: files://....?app= 2022-10-12 22:57:01 +08:00
James Feng Cao
eb30780475 revert to use pathname 2022-10-12 22:41:45 +08:00
James Feng Cao
ddcf396b11 location.pathname not work for file:// urls 2022-10-12 22:01:03 +08:00
James Feng Cao
f82c34ba62 simplify mdict parser 2022-10-12 17:43:25 +08:00
James Feng Cao
e707f7a0d4 update bookmarks 2022-10-07 10:39:52 +08:00
James Feng Cao
8d1c9b7e05 rebuilding Thu Oct 6 02:06:26 PM CST 2022 2022-10-06 14:06:27 +08:00
James Feng Cao
d860ea6c4c minor changes 2022-10-04 13:42:48 +08:00
James Feng Cao
e9c8492f9d fix typos 2022-10-02 17:17:22 +08:00
James Feng Cao
2f3eee32c2 html5 application to support file urls by appending '?app=' 2022-10-02 14:55:36 +08:00
James Feng Cao
716e044ad5 fix remote file decompressing 2022-09-29 09:45:51 +08:00
James Feng Cao
cd9dfe966d add dictionaries with local indexes and remote content 2022-09-27 17:36:44 +08:00
James Feng Cao
91ee053229 add dictionaries with local indexes and remote content 2022-09-27 17:33:31 +08:00
James Feng Cao
7c345eaa89 fix tdict links 2022-09-27 09:39:45 +08:00
James Feng Cao
5a69ed9e76 fix tdict links 2022-09-27 09:37:37 +08:00
James Feng Cao
fb32812e7b fix typos from torinfo to torapp 2022-09-24 14:19:26 +08:00
James Feng Cao
28da258433 fix typos from torinfo to torapp 2022-09-24 14:12:26 +08:00
James Feng Cao
5bcae803c8 update links 2022-09-23 11:13:35 +08:00
James Feng Cao
8a9d4b8284 minor changes 2022-09-22 16:08:03 +08:00
James Feng Cao
dc877d91b0 minor changes 2022-09-22 16:06:58 +08:00
James Feng Cao
57b3a69535 minor changes 2022-09-22 16:05:22 +08:00
James Feng Cao
1a813a7bd4 update titles 2022-09-22 07:07:51 +08:00
James Feng Cao
7df4f9b034 add download links 2022-09-19 14:19:33 +08:00
James Feng Cao
312bc28def add download links 2022-09-19 14:15:57 +08:00
James Feng Cao
4fd4f72264 enhance any links as websites: regex replacement 2022-09-18 21:45:26 +08:00
James Feng Cao
1399e83305 Enhance any links as website: regex replacement 2022-09-18 17:19:25 +08:00
James Feng Cao
4212feb617 make uweb private folder managable by 3rd-party file managers 2022-09-17 21:41:13 +08:00
James Feng Cao
70b828eba7 enhance code editor 2022-09-17 08:35:41 +08:00
James Feng Cao
197aded3ca add mirrors 2022-09-16 22:33:16 +08:00
James Feng Cao
8367fd641a default to en 2022-09-16 21:44:03 +08:00
James Feng Cao
258e18ffd5 add download links 2022-09-16 16:09:19 +08:00
James Feng Cao
d129d310c9 fix code editor 2022-09-15 16:12:42 +08:00
James Feng Cao
5fdd9e45f6 add link to address bar command mode 2022-09-15 10:07:06 +08:00
James Feng Cao
dc5bab9f17 fix address bar command mode 2022-09-15 09:58:13 +08:00
James Feng Cao
d9de58e5e5 fix mdict engine url 2022-09-15 09:48:22 +08:00
James Feng Cao
fa127bb88e rebuilding Thu Sep 15 09:46:08 AM CST 2022 2022-09-15 09:46:08 +08:00
James Feng Cao
cf79a7086b minor changes 2022-09-14 08:37:06 +08:00
James Feng Cao
154e688892 use relative path for one-click config 2022-09-13 17:29:06 +08:00
James Feng Cao
fe41bb41a4 add offline cache 2022-09-13 16:33:31 +08:00
James Feng Cao
ad12551ed7 add resource redirection 2022-09-13 16:13:02 +08:00
James Feng Cao
765740a73f fix path in pdfviewer.html 2022-09-13 13:53:31 +08:00
James Feng Cao
a0bd1d23c8 rebuilding Tue Sep 13 10:26:00 AM CST 2022 2022-09-13 10:26:01 +08:00
James Feng Cao
cdbea0e775 minor changes 2022-09-12 14:28:30 +08:00
James Feng Cao
c40f3d056d minor changes 2022-09-11 19:59:26 +08:00
James Feng Cao
75a1ce6f8a add README.zh_hans.md 2022-09-11 19:54:21 +08:00
James Feng Cao
936181547e re-implement mdict lookup support 2022-09-11 19:44:16 +08:00
James Feng Cao
c033aee378 rebuilding Sat Sep 10 08:55:34 PM CST 2022 2022-09-10 20:55:34 +08:00
James Feng Cao
32fb5a8ee2 rebuilding Sat Sep 10 08:06:12 PM CST 2022 2022-09-10 20:06:12 +08:00
James Feng Cao
323189f48d rebuilding Sat Sep 10 07:44:17 PM CST 2022 2022-09-10 19:44:17 +08:00
James Feng Cao
0728ce81f7 rebuilding Sat Sep 10 07:25:14 PM CST 2022 2022-09-10 19:25:14 +08:00
James Feng Cao
e82c754b00 rebuilding Sat Sep 10 06:53:01 PM CST 2022 2022-09-10 18:53:02 +08:00
James Feng Cao
b6eb718e75 rebuilding Fri Sep 9 03:43:09 PM CST 2022 2022-09-09 15:43:09 +08:00
James Feng Cao
bc83b5c0f9 rebuilding Tue Sep 6 05:48:18 PM CST 2022 2022-09-06 17:48:18 +08:00
James Feng Cao
da31e9824f rebuilding Mon Sep 5 04:31:45 PM CST 2022 2022-09-05 16:31:45 +08:00
James Feng Cao
896eb174d3 rebuilding Mon Sep 5 10:44:12 AM CST 2022 2022-09-05 10:44:13 +08:00
James Feng Cao
66a1f529f6 rebuilding site Sat Sep 3 11:10:42 PM CST 2022 2022-09-03 23:10:42 +08:00
James Feng Cao
aab85e6670 rebuilding site Fri Sep 2 11:07:40 PM CST 2022 2022-09-02 23:07:40 +08:00
James Feng Cao
062a4023a2 rebuilding site Fri Sep 2 11:04:01 PM CST 2022 2022-09-02 23:04:01 +08:00
James Feng Cao
a2ad390c55 rebuilding site Fri Sep 2 10:55:54 PM CST 2022 2022-09-02 22:55:54 +08:00
James Feng Cao
e1b83a0c77 rebuilding site Sun Aug 28 11:23:20 PM CST 2022 2022-08-28 23:23:20 +08:00
James Feng Cao
ab3dc78bb1 rebuilding site Sun Aug 28 11:17:31 PM CST 2022 2022-08-28 23:17:32 +08:00
James Feng Cao
0816b56023 rebuilding site Sun Aug 28 05:12:28 PM CST 2022 2022-08-28 17:12:29 +08:00
James Feng Cao
c07bb20e5c rebuilding site Fri Aug 26 08:21:46 AM CST 2022 2022-08-26 08:21:46 +08:00
James Feng Cao
74d676ab67 rebuilding site Thu Aug 25 10:40:28 AM CST 2022 2022-08-25 10:40:29 +08:00
James Feng Cao
ce8624c4f5 rebuilding site Wed Aug 17 11:16:48 AM CST 2022 2022-08-17 11:16:49 +08:00
James Feng Cao
9dab7fa895 rebuilding site Sat Aug 13 09:36:58 AM CST 2022 2022-08-13 09:36:59 +08:00
James Feng Cao
a97710929d rebuilding site Fri Aug 12 05:13:05 PM CST 2022 2022-08-12 17:13:06 +08:00
James Feng Cao
d8c79c22e0 rebuilding site Fri Aug 12 11:37:00 AM CST 2022 2022-08-12 11:37:01 +08:00
James Feng Cao
3c1095936f rebuilding site Thu Aug 11 08:34:47 PM CST 2022 2022-08-11 20:34:47 +08:00
James Feng Cao
c5845bc3dd rebuilding site Thu Aug 11 08:29:16 PM CST 2022 2022-08-11 20:29:16 +08:00
James Feng Cao
a93ccd08d3 rebuilding site Thu Aug 11 07:14:34 PM CST 2022 2022-08-11 19:14:34 +08:00
James Feng Cao
a31c2f276c rebuilding site Thu Aug 11 04:10:43 PM CST 2022 2022-08-11 16:10:44 +08:00
James Feng Cao
0694165c0a rebuilding site Sun Aug 7 09:51:21 AM CST 2022 2022-08-07 09:51:21 +08:00
James Feng Cao
eb59eb477e rebuilding site Sun Aug 7 09:20:50 AM CST 2022 2022-08-07 09:20:50 +08:00
James Feng Cao
0460249b84 rebuilding site Thu Aug 4 02:31:38 PM CST 2022 2022-08-04 14:31:39 +08:00
James Feng Cao
d432ee2d46 rebuilding site Thu Aug 4 09:41:27 AM CST 2022 2022-08-04 09:41:27 +08:00
James Feng Cao
ff9f26ebbc rebuilding site Wed Aug 3 04:57:06 PM CST 2022 2022-08-03 16:57:07 +08:00
James Feng Cao
3d731c7e4a rebuilding site Tue Aug 2 05:59:44 PM CST 2022 2022-08-02 17:59:45 +08:00
James Feng Cao
6081e5c1af rebuilding site Mon Aug 1 10:59:35 PM CST 2022 2022-08-01 22:59:35 +08:00
James Feng Cao
a35c3ed6a9 rebuilding site Mon Aug 1 10:52:46 PM CST 2022 2022-08-01 22:52:46 +08:00
James Feng Cao
3bf02f77a7 rebuilding site Mon Aug 1 10:48:03 PM CST 2022 2022-08-01 22:48:03 +08:00
James Feng Cao
47c46dc01a rebuilding site Mon Aug 1 08:22:51 PM CST 2022 2022-08-01 20:22:51 +08:00
James Feng Cao
26bfc316fc rebuilding site Mon Aug 1 09:37:00 AM CST 2022 2022-08-01 09:37:01 +08:00
James Feng Cao
1d24854e0b rebuilding site Sun Jul 31 04:18:31 PM CST 2022 2022-07-31 16:18:31 +08:00
James Feng Cao
4087db750e rebuilding site Sat Jul 30 04:35:05 PM CST 2022 2022-07-30 16:35:05 +08:00
James Feng Cao
c6909f2fbb rebuilding site Sat Jul 30 08:43:49 AM CST 2022 2022-07-30 08:43:49 +08:00
James Feng Cao
368ab38699 rebuilding site Sat Jul 30 08:20:36 AM CST 2022 2022-07-30 08:20:36 +08:00
James Feng Cao
d6fae7beef rebuilding site Sat Jul 30 08:19:14 AM CST 2022 2022-07-30 08:19:14 +08:00
James Feng Cao
04912cdc03 rebuilding site Sat Jul 30 07:53:52 AM CST 2022 2022-07-30 07:53:52 +08:00
James Feng Cao
f43b1ebbaf rebuilding site Fri Jul 29 10:45:12 PM CST 2022 2022-07-29 22:45:13 +08:00
James Feng Cao
a17b53dc11 rebuilding site Fri Jul 29 05:28:24 PM CST 2022 2022-07-29 17:28:24 +08:00
James Feng Cao
feabfe5407 rebuilding site Fri Jul 29 12:46:00 PM CST 2022 2022-07-29 12:46:00 +08:00
James Feng Cao
a64fc68def rebuilding site Fri Jul 29 12:32:43 PM CST 2022 2022-07-29 12:32:43 +08:00
James Feng Cao
6302501dca rebuilding site Fri Jul 29 09:00:37 AM CST 2022 2022-07-29 09:00:37 +08:00
James Feng Cao
7ebcc56f11 rebuilding site Fri Jul 29 08:50:13 AM CST 2022 2022-07-29 08:50:13 +08:00
James Feng Cao
9e3c8143b9 rebuilding site Fri Jul 29 08:13:45 AM CST 2022 2022-07-29 08:13:45 +08:00
James Feng Cao
69b8d15a8c rebuilding site Thu Jul 28 11:46:23 AM CST 2022 2022-07-28 11:46:23 +08:00
James Feng Cao
9ee06e8a09 rebuilding site Thu Jul 28 08:41:56 AM CST 2022 2022-07-28 08:41:56 +08:00
James Feng Cao
358bb90db0 rebuilding site Wed Jul 27 08:45:19 PM CST 2022 2022-07-27 20:45:20 +08:00
James Feng Cao
ac3c78e978 rebuilding site Tue Jul 26 05:05:34 PM CST 2022 2022-07-26 17:05:35 +08:00
293 changed files with 19948 additions and 7235 deletions

1
.gitattributes vendored Normal file
View file

@ -0,0 +1 @@
*.apk filter=lfs diff=lfs merge=lfs -text

10
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,10 @@
pages:
stage: deploy
script:
- rm -rf public
- mkdir tpublic
- ls | grep -v tpublic | xargs cp -r -t tpublic
- mv tpublic public
artifacts:
paths:
- public

0
LICENSE Normal file
View file

View file

@ -1,6 +1,55 @@
#### Uweb browser ### Uweb browser: minimal suckless web browser with unlimited power
[Uweb browser: updates, plugins and tips](https://torappinfo.github.io/uwebzh/en) <a href="README.zh-Hans.md" onclick="if(notRepo()){location='../../zh/readme/index.html#';return false;}">中文</a>
(Mirrors: [vercel](https://uweb-zh.vercel.app/en) [Amazon appstore](https://www.amazon.com/TorApp-Info-uweb-browser-for-geeks/dp/B098QPR6N5)
[netlify](https://uwebzh.netlify.app/en) [Galaxy.Store](https://galaxystore.samsung.com/detail/info.torapp.uweb)
[pages](https://uwebzh.pages.dev/en)) <a href="en/download.md" onclick="if(notRepo()){location='../../en/changelog/index.html#';return false;}">Downloads</a>
[Uweb browser: downloads, plugins and tips](https://torappinfo.github.io/uweb/en/)
(Mirrors: [gitlab](https://jamesfengcao.gitlab.io/uweb/en/) [frama](https://torappinfo.frama.io/uweb/en/) [codeberg](https://jamesfengcao.codeberg.page/en/) [repo](https://repo.or.cz/uweb.git/blob_plain/HEAD:/en/index.html) [fleek](https://uweb.on-fleek.app/en/) [netlify](https://uwebzh.netlify.app/en/) [surge](https://uweb.surge.sh/en/) [kinsta](https://uwebbrowser-t27o4.kinsta.page) [zeabur](https://uweb.zeabur.app/en/) [bitbucket](https://torappinfo.bitbucket.io/en/) [pages](https://muweb.pages.dev/en/) [vercel](https://uweb.vercel.app/en/) [render](https://uweb.onrender.com/en/) <a href="en/mirrors.md" onclick="if(notRepo()){location='../../en/mirrors/index.html#';return false;}">More...</a>)
- <a href="en/search.md" onclick="if(notRepo()){location='../search/index.html#';return false;}">AI chat as search engine</a>; optimized UI for both AI and traditional search; [input helpers](https://uwebzh.netlify.app/en/input/index.html#) for complex query.
- <a href="en/tips.md" onclick="if(notRepo()){location='../redirect/index.html#';return false;}">Global redirection</a> to bypass censorship.
- Convenient: Any AI chatbot/book/dictionary/txt/command line/app/webapp (web extensions) as search engine.
- Tiny: less than 250k.
- Fast: run fast, even with thousands of user provided css/scripts/htmls.
- Efficient: less touches, one click to reach any number of search engines without repeated input; automate online services.
- Powerful: any native functionality with html5 enhancement and still secure; any urls to host website; javascript and shell scripting for general processing.
- Customizable: user-defined menus, (new) buttons and gestures for user agents, bookmarklets, url services, shell commands, internal functionality links and text processing etc.
- URL bar command line support ("!" and .js file as command).
- Site-specific JS/CSS/HTML/preprocessing.
- Online play/preview/preprocess for downloadable resources.
- Multiple type profiles: switch any data including website logins, user configurations orthogonally.
- Supports enhanced user "hosts" file. Empty IP address to lift all server-imposed limitations.
- Website test automation scripting. crontab support (alarm clock and more).
#### Main features
Custom paper size PDF export and long vector screenshot, TTS, text reflow, resource sniffer, translation, reader's mode, user-defined url redirection, webdav/http backup & restore, auto next page, sending/receiving msg/file(s), site config (UA, no JS, no image, no 3rd party script/resource,active script, global scripts), http(s)/socks proxy, Wake-on-LAN, enabling html5 apps for local files (pdf/djvu/epub viewer, mdict dictionary lookup etc.).
- Bookmarklets (works for CSP sites and with option to auto apply to similar sites)
- AD blocking (block whole root domain trees etc.)
- Serverless local sites: PWA-kind web extension (chrome .crx & firefox .xpi) support.
- Resizable floating video support.
#### Screenshots
![](https://i.postimg.cc/rsL9G5N1/home1.png)
![](https://i.postimg.cc/9QxJ3Rc2/globalcss.png)
![](https://i.postimg.cc/VksDHBQ4/globaljs.png)
![](https://i.postimg.cc/HLV3TYLy/longclick.png)
![](https://i.postimg.cc/XJ58ysdN/option1.png)
![](https://i.postimg.cc/0NFnQT6H/option2.png)
#### <a href="misc/ebrowser/README.md" onclick="if(notRepo()){location='../../en/ebrowserreadme/index.html#';return false;}">Ebrowser</a> for Windows, MacOS and Linux
Ebrowser is a simple version of uweb browser on the desktop.
- Fully open source.
- Capture long screenshot as vector graphics.
- Enabling web tech for vector designing to replace Adobe Illustrator/Inkscape.
#### Help with localization
We encourage everyone to help with localization. The following is how to do.
- Fork this repository
- Copy res/values/strings.xml to path like res/values-%(lang)/, replace %(lang) with [the ISO 639-1 language code](http://www.loc.gov/standards/iso639-2/php/code_list.php).
- Translate res/values-%(lang)/strings.xml
- Translate assets/help_%(lang).html from assets/help_en.html
- Make a Pull Request

63
README.zh-Hans.md Normal file
View file

@ -0,0 +1,63 @@
### 超微浏览器 (uweb browser): 释放无尽威能,微、威、快、高效、极致优化
<a href="README.md" onclick="if(notRepo()){location='../../en/readme/index.html#';return false;}">English</a>
<a href="zh/donate.md" onclick="if(notRepo()){location='../searchurl/donate.html#';return false;}">捐赠</a>
[Amazon appstore](https://www.amazon.com/TorApp-Info-uweb-browser-for-geeks/dp/B098QPR6N5)
[Galaxy.Store](https://galaxystore.samsung.com/detail/info.torapp.uweb)
<a href="en/download.md" onclick="if(notRepo()){location='../../en/changelog/index.html#';return false;}">下载</a>
[超微浏览器下载及使用技巧](https://repo.or.cz/uweb.git/blob_plain/HEAD:/zh/index.html)
(镜像: [grebe](https://uweb.grebedoc.dev/zh/) [gitlab](https://jamesfengcao.gitlab.io/uweb/zh/) [frama](https://torappinfo.frama.io/uweb/zh/) [repo](https://repo.or.cz/uweb.git/blob_plain/HEAD:/zh/index.html) [codeberg](https://uweb.codeberg.page/zh/) [github](https://torappinfo.github.io/uweb/zh/) [render](https://uweb.onrender.com/zh/) [surge](https://uweb.surge.sh/zh/) [netlify](https://uwebzh.netlify.app/zh/) [pgs](https://uweb-m.pgs.sh/zh/) [kinsta](https://uwebbrowser-t27o4.kinsta.page/zh/) [fleek](https://uweb.on-fleek.app/zh/) [pages](https://muweb.pages.dev/zh/) [bitbucket](https://torappinfo.bitbucket.io/zh/) [torapp](https://torapp.eu.org/zh/) [torappv](https://uweb.torapp.eu.org/zh/) [zeabur](https://uweb.zeabur.app/zh/) [static](https://uweb.staticrun.app) [statichost](https://torappinfo-uweb.statichost.eu) [maozi](https://uweb.maozi.io/zh/) [vercel](https://uweb.vercel.app/zh/) <a href="en/mirrors.md" onclick="if(notRepo()){location='../../en/mirrors/index.html#';return false;}">专用镜像...</a>)
- <a href="zh/search.md" onclick="if(notRepo()){location='../search/index.html#';return false;}">提供20多deepseek满血版接入点。</a>
- <span style="color:red">免魔法国内直接访问英文技术网站如<a href="zh/tips.md" onclick="if(notRepo()){location='../tips/index.html#';return false;}">google、百科等</a></span>
- 无需帐号无限制支持claude4.5chatgpt5.1, gemini 2.5 pro/flash, grok4等超过500个最新AI模型免费使用。少部分地区需配合上一条技术
- <a href="zh/search.md" onclick="if(notRepo()){location='../search/index.html#';return false;}">AI聊天可作为搜索引擎</a>,对复杂问询提供多种[输入辅助](https://uwebzh.netlify.app/zh/input/index.html#);不受剪贴板长度限制,[超长文本自由传](https://uwebzh.netlify.app/zh/textprocess/index.html#) (AI输入或共享)。
- 微不到250K。
- 威无穷无尽的功能使用增强后的html5可以实现任何本地应用功能。支持使用js脚本、url服务、shell命令、内部功能链接定制菜单按钮手势; 远程数据皆可成网站。
- 便捷AI聊天/图书/txt/词典/命令行/APP/webapp可作为搜索引擎使用。
- 快:手机越慢,脚本插件越多越明显。
- 高效:最少的操作,在线服务全自动(参看常用链接网页)。
- 极致优化:最少存储写操作,比如浏览器转到后台前配置变化如恢复成原样则无写操作。
- 地址栏支持命令行 ("!", 物理键盘支持更佳)
- 指定域名: 用户定义JS/CSS/HTML/显示前源码预处理
- 支持用户定义域名属性。
- 下载资源在线播放/预览/预处理。
- 独立切换网站登录、配置文件。
- 支持网站测试自动化脚本 (可用于app服务端测试)。支持crontab(闹钟、定时任务等)。
#### 截屏
![](https://i.postimg.cc/rsL9G5N1/home1.png)
![](https://i.postimg.cc/9QxJ3Rc2/globalcss.png)
![](https://i.postimg.cc/VksDHBQ4/globaljs.png)
![](https://i.postimg.cc/HLV3TYLy/longclick.png)
![](https://i.postimg.cc/XJ58ysdN/option1.png)
![](https://i.postimg.cc/0NFnQT6H/option2.png)
#### 软件功能
输出自定义页面大小PDF、矢量图长截屏、朗读、文本重排、嗅探、比价、翻译、视频解析、离线保存、阅读模式(推荐与脚本激活模式配合)、网址重定向至国内、多帐号切换、网盘离线下载、文件管理、webdav/http空间备份/恢复任何指定文件集、智能翻页、目录文件传送、网站独立设置ua禁用脚本无图激活脚本、行编辑器、网络唤醒(Wake-on-LAN)。通过安装html5应用可预览阅读本地或在线任意格式文件pdf,djvu,epub,mdx/mdd,docx等
修仙小说里面有一种异能,叫做“成功可以复制”,只要成功一次,就能无限复制。超微浏览器中这种异能叫"超级书签"。成功使用时保存,需要时就可以无限恢复。
小书签(bookmarklet)再也不用手工输入,直接将小书签网站加入书签即可。运行时长按出菜单后选择“在新窗口中打开”,小书签将作用于最后一个窗口。
独创不良信息绝杀:阻止指定根域名的一切子域名、孙域名...,不良信息一网打尽。 支持根域名前缀、网址路径正则表达式。
独创脚本激活模式,脚本执行后被激活,此后自动作用于同类网址。
支持全局用户脚本/样式,可任意叠加,轻松切换。
支持网址特定脚本/样式,可轻松支持百万以上不同脚本。
支持自定义任意多个搜索引擎; 支持执行用户提供任何js文件; 支持用户定义任意多个useragent; 长按链接支持运行第三方程序; 长按链接支持运行用户js文件。
安装定制版Termux然后再安装超微浏览器顺序不能错可用地址栏作图类似matlab功能、超级计算器无限精度/π的前万位或更多、无限函数、无限常量、符号演算解方程、分解因式、求积分导数、离线字典查找等。譬如地址栏输入sin(x)**5就直接得到函数图形。利用好第三方代码才能真正发挥出uWeb的潜能。
#### <a href="misc/ebrowser/README.md" onclick="if(notRepo()){location='../../en/ebrowserreadme/index.html#';return false;}">Ebrowser</a> for Windows, MacOS and Linux
可看作超微浏览器台式机简易版,用于弥补普通浏览器访问痛点。
- 支持网站自动镜像可以使用国内镜像自动访问github等网站可与国际搜索引擎无缝衔接。
- 同样允许直接访问英文技术网站。
- 网页矢量长截屏允许通过mermaid等设计矢量图案。
- 可用网页设计代替Adobe Illustrator平面设计。
- 完全开源,共同探索浏览新技术。

63
README.zh.md Normal file
View file

@ -0,0 +1,63 @@
### 超微浏览器 (uweb browser): 释放无尽威能,微、威、快、高效、极致优化
<a href="README.md" onclick="if(notRepo()){location='../../en/readme/index.html#';return false;}">English</a>
<a href="zh/donate.md" onclick="if(notRepo()){location='../searchurl/donate.html#';return false;}">捐赠</a>
[Amazon appstore](https://www.amazon.com/TorApp-Info-uweb-browser-for-geeks/dp/B098QPR6N5)
[Galaxy.Store](https://galaxystore.samsung.com/detail/info.torapp.uweb)
<a href="en/download.md" onclick="if(notRepo()){location='../../en/changelog/index.html#';return false;}">下载</a>
[超微浏览器下载及使用技巧](https://repo.or.cz/uweb.git/blob_plain/HEAD:/zh/index.html)
(镜像: [grebe](https://uweb.grebedoc.dev/zh/) [gitlab](https://jamesfengcao.gitlab.io/uweb/zh/) [frama](https://torappinfo.frama.io/uweb/zh/) [repo](https://repo.or.cz/uweb.git/blob_plain/HEAD:/zh/index.html) [codeberg](https://uweb.codeberg.page/zh/) [github](https://torappinfo.github.io/uweb/zh/) [render](https://uweb.onrender.com/zh/) [surge](https://uweb.surge.sh/zh/) [netlify](https://uwebzh.netlify.app/zh/) [pgs](https://uweb-m.pgs.sh/zh/) [kinsta](https://uwebbrowser-t27o4.kinsta.page/zh/) [fleek](https://uweb.on-fleek.app/zh/) [pages](https://muweb.pages.dev/zh/) [bitbucket](https://torappinfo.bitbucket.io/zh/) [torapp](https://torapp.eu.org/zh/) [torappv](https://uweb.torapp.eu.org/zh/) [zeabur](https://uweb.zeabur.app/zh/) [static](https://uweb.staticrun.app) [statichost](https://torappinfo-uweb.statichost.eu) [maozi](https://uweb.maozi.io/zh/) [vercel](https://uweb.vercel.app/zh/) <a href="en/mirrors.md" onclick="if(notRepo()){location='../../en/mirrors/index.html#';return false;}">专用镜像...</a>)
- <a href="zh/search.md" onclick="if(notRepo()){location='../search/index.html#';return false;}">提供20多deepseek满血版接入点。</a>
- <span style="color:red">免魔法国内直接访问英文技术网站如<a href="zh/tips.md" onclick="if(notRepo()){location='../tips/index.html#';return false;}">google、百科等</a></span>
- 无需帐号无限制支持claude4.5chatgpt5.1, gemini 2.5 pro/flash, grok4等超过500个最新AI模型免费使用。少部分地区需配合上一条技术
- <a href="zh/search.md" onclick="if(notRepo()){location='../search/index.html#';return false;}">AI聊天可作为搜索引擎</a>,对复杂问询提供多种[输入辅助](https://uwebzh.netlify.app/zh/input/index.html#);不受剪贴板长度限制,[超长文本自由传](https://uwebzh.netlify.app/zh/textprocess/index.html#) (AI输入或共享)。
- 微不到250K。
- 威无穷无尽的功能使用增强后的html5可以实现任何本地应用功能。支持使用js脚本、url服务、shell命令、内部功能链接定制菜单按钮手势; 远程数据皆可成网站。
- 便捷AI聊天/图书/txt/词典/命令行/APP/webapp可作为搜索引擎使用。
- 快:手机越慢,脚本插件越多越明显。
- 高效:最少的操作,在线服务全自动(参看常用链接网页)。
- 极致优化:最少存储写操作,比如浏览器转到后台前配置变化如恢复成原样则无写操作。
- 地址栏支持命令行 ("!", 物理键盘支持更佳)
- 指定域名: 用户定义JS/CSS/HTML/显示前源码预处理
- 支持用户定义域名属性。
- 下载资源在线播放/预览/预处理。
- 独立切换网站登录、配置文件。
- 支持网站测试自动化脚本 (可用于app服务端测试)。支持crontab(闹钟、定时任务等)。
#### 截屏
![](https://i.postimg.cc/rsL9G5N1/home1.png)
![](https://i.postimg.cc/9QxJ3Rc2/globalcss.png)
![](https://i.postimg.cc/VksDHBQ4/globaljs.png)
![](https://i.postimg.cc/HLV3TYLy/longclick.png)
![](https://i.postimg.cc/XJ58ysdN/option1.png)
![](https://i.postimg.cc/0NFnQT6H/option2.png)
#### 软件功能
输出自定义页面大小PDF、矢量图长截屏、朗读、文本重排、嗅探、比价、翻译、视频解析、离线保存、阅读模式(推荐与脚本激活模式配合)、网址重定向至国内、多帐号切换、网盘离线下载、文件管理、webdav/http空间备份/恢复任何指定文件集、智能翻页、目录文件传送、网站独立设置ua禁用脚本无图激活脚本、行编辑器、网络唤醒(Wake-on-LAN)。通过安装html5应用可预览阅读本地或在线任意格式文件pdf,djvu,epub,mdx/mdd,docx等
修仙小说里面有一种异能,叫做“成功可以复制”,只要成功一次,就能无限复制。超微浏览器中这种异能叫"超级书签"。成功使用时保存,需要时就可以无限恢复。
小书签(bookmarklet)再也不用手工输入,直接将小书签网站加入书签即可。运行时长按出菜单后选择“在新窗口中打开”,小书签将作用于最后一个窗口。
独创不良信息绝杀:阻止指定根域名的一切子域名、孙域名...,不良信息一网打尽。 支持根域名前缀、网址路径正则表达式。
独创脚本激活模式,脚本执行后被激活,此后自动作用于同类网址。
支持全局用户脚本/样式,可任意叠加,轻松切换。
支持网址特定脚本/样式,可轻松支持百万以上不同脚本。
支持自定义任意多个搜索引擎; 支持执行用户提供任何js文件; 支持用户定义任意多个useragent; 长按链接支持运行第三方程序; 长按链接支持运行用户js文件。
安装定制版Termux然后再安装超微浏览器顺序不能错可用地址栏作图类似matlab功能、超级计算器无限精度/π的前万位或更多、无限函数、无限常量、符号演算解方程、分解因式、求积分导数、离线字典查找等。譬如地址栏输入sin(x)**5就直接得到函数图形。利用好第三方代码才能真正发挥出uWeb的潜能。
#### <a href="misc/ebrowser/README.md" onclick="if(notRepo()){location='../../en/ebrowserreadme/index.html#';return false;}">Ebrowser</a> for Windows, MacOS and Linux
可看作超微浏览器台式机简易版,用于弥补普通浏览器访问痛点。
- 支持网站自动镜像可以使用国内镜像自动访问github等网站可与国际搜索引擎无缝衔接。
- 同样允许直接访问英文技术网站。
- 网页矢量长截屏允许通过mermaid等设计矢量图案。
- 可用网页设计代替Adobe Illustrator平面设计。
- 完全开源,共同探索浏览新技术。

113
assets/help_en.html Normal file
View file

@ -0,0 +1,113 @@
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width" /><base href=
../en/
><title>Manual</title></head>
<center><b>Manual</b> <a href="i:1fhelp_zh">中文</a></center>
<b>Frequently visited links::</b><br>
<a href="index.html">Settings & tips</a> (
<a href="https://torappinfo.github.io/uweb/en/">github</a>
<a href="https://jamesfengcao.gitlab.io/uweb/en/">gitlab</a>
<a href="https://torappinfo.frama.io/uweb/en/">frama</a>
<a href="https://uweb.on-fleek.app/en/">fleek</a>
<a href="https://repo.or.cz/uweb.git/blob_plain/HEAD:/en/index.html">repo</a>
<a href="https://torappinfo.bitbucket.io/en/">bitbucket</a>
<a href="https://uweb.vercel.app/en/">vercel</a>
<a href="https://uwebzh.netlify.app/en/">netlify</a>
<a href="https://muweb.pages.dev/en/">pages</a>
<a href="https://jamesfengcao.codeberg.page/en/">codeberg</a>
<a href="https://uweb.surge.sh/en/">surge</a>
<a href="https://uweb.onrender.com/en">render</a>
<a href="https://uweb.zeabur.app/en/">zeabur</a>
<a href="javascript:" onclick="document.location.hash='#mirrors'">More...</a>
)<br>
<p>
<a href="i:61ver:https://uwebzh.netlify.app/latest.html#">Check for updates</a><br>
<a href="i:61:https://fastly.jsdelivr.net/gh/torappinfo/uweb/en/searchurl/func.html">UI configuration</a>(<a href="i:61:https://gitee.com/jamesfengcao/uweb/raw/master/en/searchurl/func.html">gitee</a>)<br>
<a href="i:60/data/data/info.torapp.uweb/files/config.html:https://jamesfengcao.codeberg.page/en/searchurl/config.html">Advanced customization</a><br>
</p>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/">App folder</a><br>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/bookmark/">More bookmarks</a>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/offline/">Offline</a>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/sbookmark/">Super bookmarks</a><br>
<a target="_blank" href="file:///sdcard/Download/">Download</a>
<a target="_blank" href="i:1e">sdcard Download</a><br>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/uweb.log">Error log</a><br>
<br>
<b>Use multiple engines::</b><br>
Type in main screen input or address bar, then click on any search engine on the top part of home screen.<br>
<br>
<b>Toolbar::</b><br>
Swipe down at top or swipe at any bottom corner to show.<br>
<ul>
<li>[⟳] reload/stop web page; long press for <a href="javascript:" onclick="document.location.hash='spinneroptions'">spinner options</a>.</li>
<li><- : long press for auto page turning</li>
<li>-> : long press for app menu.</li>
<li>[⚙️]Settings: long press for <a href="javascript:" onclick="document.location.hash='options'">options</a>.</li>
<li>[□] tab showment; long press for <a href="globalcss/index.html#">global css</a>, <a target="_blank" href="file:///data/data/info.torapp.uweb/files/css/">show "css/"</a>.</li>
<li>[🏠]Home screen: long press for new tab. </li>
<li>[☰] more tools; long pressed to configure <a href="rjs/index.html#">global javascripts</a>, <a target="_blank" href="file:///data/data/info.torapp.uweb/files/js/">show "js/"</a>.</li>
</ul>
<b>More tools::</b><br>
<ul>
<li>[🖥️]PC: fake as desktop PC; long press for more UAs, <a href=file:///data/data/info.torapp.uweb/files/default.uas>show default.uas</a>.</li>
<li>[JS] disable/enable javascript; long press for <a href="rjs/index.html#">more javascripts</a>, <a target="_blank" href="file:///data/data/info.torapp.uweb/files/bookmarklet/">show "bookmarklet/"</a>.</li>
<li>[IMG] hide/show images; long press for <a href="urls/index.html#">more services</a>, <a href=file:///data/data/info.torapp.uweb/files/default.urls>show default.url</a>.</li>
<li>[☆] add bookmark; long press for <a href="links/index.html#">links menu</a>, <a href=file:///data/data/info.torapp.uweb/files/default.link>show default.link</a>. </li>
<li>[🕔] history, long press for <a href="cmds/index.html#">user defined commands</a>, <a href=file:///data/data/info.torapp.uweb/files/default.cmds>show default.cmds</a>. </li>
<li>[🔍 Magnifier] search in the current page; long press for <a href="rjs/index.html#">remote scripts</a>, <a href=file:///data/data/info.torapp.uweb/files/default.rjs>show default.rjs</a>. </li>
<li>[🔗]Copy link, long press for <a href="textprocess/index.html#">menus for text selection</a>, <a href=file:///data/data/info.torapp.uweb/files/default.select>show default.select</a>. </li>
<li>Share the url: <a href="textprocess/index.html">process clipboard text</a> when in home screen, otherwise share the page url. Long press for input phrases, <a href=file:///data/data/info.torapp.uweb/files/default.input>show default.input</a>.</li>
<li>[X]Exit browser.</li>
<li>[▽]Go to the bottom.</li>
<li>[△]Go to the top.</li>
<li>[🔊]Speak: non-url address bar texts/selected texts/whole web page. Press again to stop.</li>
<li>[📃]Text reflow.</li>
<li>[☁]Download/Copy local files.</li>
<li>[👤]Switch profile.</li>
</ul>
<b><a id="options">Options</a>::</b><br>
Long press "settings" button to configure options.
<ul>
<li>adblock: block all subdomains.<br>
Need hosts file <a href=file:///data/data/info.torapp.uweb/files/default.hosts>default.hosts</a>.
</li>
<li>Activate user script: when activated, the script will be run on similiar sites, until another script is activated or app exits.</li>
<li><a href="sitejs/index.html#">Run user scripts for sites</a>.</li>
<li>Resource sniffer: Show results when deselected. Use file <a href=file:///data/data/info.torapp.uweb/files/types.sniff>types.sniff</a> to sniff specified file types. Empty file to sniff all kinds.</li>
</ul>
<b><a id="spinneroptions">Spinner options</a>::</b>
<ul>
<li><a href=file:///data/data/info.torapp.uweb/files/colors.txt>Background color</a></li>
<li><a href=file:///data/data/info.torapp.uweb/files/default.uas>User agent</a></li>
<li>Address bar mode, <a href=file:///data/data/info.torapp.uweb/files/default.acmd>show default.acmd</a></li>
</ul>
<b><a id="mirrors">More mirrors</a>::</b><br>
<a href="https://fastly.jsdelivr.net/gh/torappinfo/uweb/redirect.html#">Test1</a>
<a href="https://gitea.com/torappinfo/uweb/raw/branch/master/redirect.html#">Test2</a>
<a href="i:0mi:5h?format=raw::https://sourceforge.net/p/uwebbrowser/code/ci/master/tree/redirect.html">Test3</a>
<a href="i:0mi:5h?format=raw::https://rocketgit.com/user/torappinfo/uweb/source/tree/branch/master/blob_download/redirect.html">Test4</a>
<a href="https://notabug.org/torappinfo/uweb/raw/master/redirect.html#">Test5</a>
<a href="https://git.launchpad.net/uweb/plain/redirect.html#">Test6</a>
<a href="https://framagit.org/torappinfo/uweb/-/raw/master/redirect.html#">Test7</a>
<a href="https://git.froggi.es/jamesfengcao/uweb/raw/branch/master/redirect.html#">Test9</a>
<a href="https://git.disroot.org/torappinfo/uweb/raw/branch/master/redirect.html#">Test10</a>
<a href="https://gitdab.com/jamesfengcao/uweb/raw/branch/master/redirect.html#">Test11</a>
<a href="https://pagure.io/uweb/raw/master/f/redirect.html#">Test12</a>
<a href="i:0mi:5h/xxxx/?path=::https://dev.azure.com/jamesfengcao/1d8bf6c7-7c24-4441-bc5e-9709dcaf37fc/_apis/git/repositories/2a588d9b-f25a-46c0-bb3b-f685c635fcf8/itemsxxxx/redirect.html">Test14</a>
<a href="https://gitcode.net/uweb/uweb/-/raw/master/redirect.html#">Test15</a>
<a href="https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html#">Test17</a>
<a href="https://dagshub.com/torappinfo/uweb/raw/master/redirect.html#">dagshub</a>
<a href="https://gitgud.io/jamesfengcao/uweb/-/raw/master/redirect.html#">gitgud</a>
<br><br>
<a href="https://github.com/torappinfo/uweb">Project home</a><br>

166
assets/help_zh.html Normal file
View file

@ -0,0 +1,166 @@
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width" /><base href=
../zh/
><title>使用攻略</title></head>
<center><b>使用攻略</b> <a href="i:1fhelp_en">English</a></center>
<a href="https://gitee.com/jamesfengcao/uweb/raw/master/zh/index.html#">设置及技巧</a> (
<a href="https://jamesfengcao.atomgit.net/uweb/zh/">atomgit</a>
<a href="https://torappinfo.frama.io/uweb/zh/">frama</a>
<a href="https://jamesfengcao.gitlab.io/uweb/zh/">gitlab</a>
<a href="https://repo.or.cz/uweb.git/blob_plain/HEAD:/zh/index.html">repo</a>
<a href="https://jamesfengcao.codeberg.page/zh/">codeberg</a>
<a href="https://uweb.surge.sh/zh/">surge</a>
<a href="https://torappinfo.github.io/uweb/zh/">github</a>
<a href="https://uwebzh.netlify.app/zh/">netlify</a>
<a href="https://uwebbrowser-t27o4.kinsta.page/zh/">kinsta</a>
<a href="https://uweb.on-fleek.app/zh/">fleek</a>
<a href="https://uweb.onrender.com/zh/">render</a>
<a href="https://torapp.eu.org/zh/">torapp</a>
<a href="https://muweb.pages.dev/zh/">pages</a>
<a href="https://uweb.glitch.me/zh/">glitch</a>
<a href="https://uweb.zeabur.app/zh/">zeabur</a>
<a href="https://uwebbrowser.sourceforge.io">sf</a>
<a href="javascript:" onclick="document.location.hash='#mirrors'">...</a>
)<br>
<b>常用链接::</b><br>
<a href="i:61ver:https://gitee.com/jamesfengcao/uweb/raw/master/latest.html#">检测并下载最新版</a><br>
<a href="i:61:https://repo.or.cz/uweb.git/blob_plain/HEAD:/zh/searchurl/func.html">界面配置及杂项</a>(<a href="i:61:https://gitee.com/jamesfengcao/uweb/raw/master/zh/searchurl/func.html">gitee镜像</a>)<br>
<a href="i:60/data/data/info.torapp.uweb/files/config.html:https://gitee.com/jamesfengcao/uweb/raw/master/zh/searchurl/config.html">高级个性化定制</a><br>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/">内部目录</a>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/bookmark/">分类书签</a>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/offline/">离线网页</a>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/sbookmark/">超级书签</a><br>
<a target="_blank" href="file:///sdcard/Download/">下载</a>
<a target="_blank" href="i:1e">sd卡下载目录</a><br>
<a target="_blank" href="data:text/html;charset=utf-8,<body contenteditable%3E">空白便签</a><br>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/uweb.log">出错报告</a><br>
<br>
<b>主屏查询举例::</b><br>
在主屏中间输入框或顶部地址栏内输入“牛奶”,再点击上面搜索引擎“值得买”。<br>
<br>
<b>提示::</b>
<ul>
<li>底部工具条更多工具可左右滑动。</li>
<li>连点‘后退’按钮退出当前窗口。</li>
</ul>
<b>顶部工具条::</b><br>
从浏览器顶部往下拉或短按底部工具条页面搜索可显示。<br>
<br>
<b>底部工具条::</b><br>
左/右下角滑动或顶部/地址栏下方下拉可显示。<br>
<ul>
<li>[⟳] 刷新/中断网页;长按出现<a href="javascript:" onclick="document.location.hash='spinneroptions'">功能选择</a></li>
<li>[<-]后退: 长按智能翻页</li>
<li>[->]前进: 无前进历史时智能翻页。长按弹出系统菜单。</li>
<li>[⚙️]设置: 长按显示<a href="javascript:" onclick="document.location.hash='#options'">系统设置</a></li>
<li>[□] 窗口管理;长按打开<a href="globalcss/index.html#">全局用户css样式选项</a>, <a target="_blank" href="file:///data/data/info.torapp.uweb/files/css/">访问目录"css/"</a></li>
<li>[🏠]主屏,长按打开新窗口。</li>
<li>[☰] 更多工具;长按弹出<a href="rjs/index.html#">全局js脚本设置</a>, <a target="_blank" href="file:///data/data/info.torapp.uweb/files/js/">访问目录"js/"</a></li>
</ul>
更多工具:
<ul>
<li>[🖥️]PC: 伪装成桌面浏览器长按则在左上角弹出菜单显示更多用户配置UA<a href=file:///data/data/info.torapp.uweb/files/default.uas>查看default.uas</a></li>
<li>[JS] 关闭/打开javascript支持长按显示<a href="rjs/index.html#">更多脚本功能</a>, <a target="_blank" href="file:///data/data/info.torapp.uweb/files/bookmarklet/">访问目录"bookmarklet/"</a></li>
<li>[IMG] 关闭/打开图像显示;长按显示<a href="urls/index.html#">特色服务</a>, <a href=file:///data/data/info.torapp.uweb/files/default.urls>查看default.urls</a></li>
<li>[☆] 添加书签;长按显示<a href="links/index.html#">常用链接</a>, <a href=file:///data/data/info.torapp.uweb/files/default.link>查看default.link</a></li>
<li>[🕔] 访问历史,长按显示<a href="cmds/index.html#">预定义命令<a>, <a href=file:///data/data/info.torapp.uweb/files/default.cmds>查看default.cmds</a></li>
<li>[🔍]页面搜索:长按唤出<a href="rjs/index.html#">远程脚本菜单</a>, <a href=file:///data/data/info.torapp.uweb/files/default.rjs>查看default.rjs</a></li>
<li>[🔗]复制链接:长按显示<a href="textprocess/index.html#">对选中内容作用户定义操作</a>菜单,<a href=file:///data/data/info.torapp.uweb/files/default.select>查看default.select</a></li>
<li>网址分享:主屏下对剪贴板数据进行<a href="textprocess/index.html#">文本处理</a>。长按显示输入法短语,<a href=file:///data/data/info.torapp.uweb/files/default.input>查看default.input</a>.</li>
<li>[X]退出浏览器</li>
<li>[▽]底部</li>
<li>[△]顶部</li>
<li>[🔊]朗读: 优先朗读顶部工具条搜索栏非网址内容、网页选中内容,最后为整个网页。再次朗读可中断上次朗读操作,地址栏朗读专为学习外语单词发音而设计。</li>
<li>[📃]文本重排</li>
<li>[☁↓]保存在线网页/复制本地内容到目录</li>
<li>[👤]账户切换</li>
</ul>
注:可通过关闭[JS]/[IMG]来屏蔽广告,这种屏蔽方式没有性能损失。<br>
<br>
<b><a id="options">系统设置</a>::</b><br>
<ul>
<li>不良信息拦截:与其它应用不同,此选项拦截一切子域名、孙域名......。<br>
需hosts文件<a href=file:///data/data/info.torapp.uweb/files/default.hosts>default.hosts</a>
每行一个域名。<br>
<a href="adblock/">攻略</a>
</li>
<li>缓存优先:优先使用缓存内容,可在离线状态下访问已缓存网页。</li>
<li>激活用户脚本:首次执行用户脚本后,访问同类网站时会自动执行此脚本,直至清空后台或另一脚本被激活。</li>
<li><a href="sitejs/index.html#">执行网站用户脚本</a></li>
<li>概览模式: 显示完整页面宽度,有时字体会比较小。</li>
<li>离线资源: 使用用户自备数据代替网站内容。</li>
<li>资源嗅探:取消选项时显示嗅探结果。可用<a href=file:///data/data/info.torapp.uweb/files/types.sniff>types.sniff</a>控制嗅探类型,空文件嗅探一切。</li>
<li>弹出视频地址: <a href=file:///data/data/info.torapp.uweb/files/types.sniff>types.sniff</a>控制嗅探类型。</li>
</ul>
<b><a id="spinneroptions">功能选择</a>::</b>
<ul>
<li><a href=file:///data/data/info.torapp.uweb/files/colors.txt>背景色</a></li>
<li>地址栏功能选择,<a href=file:///data/data/info.torapp.uweb/files/default.acmd>查看default.acmd</a></li>
</ul>
<b>书签文件::</b><br>
用户可随意编辑文件<a href=file:///data/data/info.torapp.uweb/files/bookmark.html>bookmark.html</a>插入CSS样式。但最好仍然让每个书签占一行可简化管理。<br>
<br>
<b>长按链接::</b>
<ul>
<li>新窗口打开:当链接为小书签时,小书签将作用于除本窗口外的最后一个窗口。</li>
<li>屏蔽根域名:屏蔽当前链接的根域名,可能的话建议用户取域名的最后两部分。</li>
</ul>
<b>高级配置::</b><br>
点击本页面文件名链接弹出文本编辑器,部分链接为文件目录,长按可显示目录路径; 如果目录存在,点击可进入。使用底部下载按钮复制文件或目录至应用内部目录,可以扩展浏览器功能。
<ul>
<li>如果存在文件<a href=file:///data/data/info.torapp.uweb/files/home5.html>home5.html</a>,就以此为主屏。</li>
<li>运行用户javascript 长按底部工具条[JS]按钮则弹出菜单显示<a target="_blank" href="file:///data/data/info.torapp.uweb/files/bookmarklet/">bookmarklet</a>目录下所有js文件供用户挑选执行。</li>
<li>用户代理(user agent)配置: <a href=file:///data/data/info.torapp.uweb/files/default.uas>default.uas</a>。文件每行以回车结尾,格式为:<br>
[UA名]:[UA字符串]</li>
<li><a href="search/index.html#">搜索引擎配置</a> <a href=file:///data/data/info.torapp.uweb/files/home5.search>home5.search</a>。文件每行以回车结尾,格式为:<br>
[引擎名]:[引擎url] </li>
<li>长按底部工具条[IMG]按钮弹出菜单显示<a href=file:///data/data/info.torapp.uweb/files/default.urls>default.urls</a>中辅助功能,配置文件格式与搜索引擎完全相同,每行格式如下:<br>
[功能名]:[提供功能网址] </li>
</ul>
<b><a id="mirrors">更多镜像</a>::</b><br>
<a href="https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html#">试验1</a>
<a href="https://gitcode.net/uweb/uweb/-/raw/master/redirect.html#">2</a>
<a href="https://raw.gitcode.com/uweb/uweb/raw/master/redirect.html#">4</a>
<a href="https://gitea.com/torappinfo/uweb/raw/branch/master/redirect.html#">5</a>
<a href="i:0mi:5h?format=raw::https://sourceforge.net/p/uwebbrowser/code/ci/master/tree/redirect.html">6</a>
<a href="i:0mi:5h?format=raw::https://rocketgit.com/user/torappinfo/uweb/source/tree/branch/master/blob_download/redirect.html">7</a>
<a href="https://notabug.org/torappinfo/uweb/raw/master/redirect.html#">8</a>
<a href="https://git.launchpad.net/uweb/plain/redirect.html#">9</a>
<a href="https://framagit.org/torappinfo/uweb/-/raw/master/redirect.html#">10</a>
<a href="https://git.froggi.es/jamesfengcao/uweb/raw/branch/master/redirect.html#">12</a>
<a href="https://git.disroot.org/torappinfo/uweb/raw/branch/master/redirect.html#">13</a>
<a href="https://gitdab.com/jamesfengcao/uweb/raw/branch/master/redirect.html#">14</a>
<a href="i:0mi:5h/xxxx/?path=::https://dev.azure.com/jamesfengcao/1d8bf6c7-7c24-4441-bc5e-9709dcaf37fc/_apis/git/repositories/2a588d9b-f25a-46c0-bb3b-f685c635fcf8/itemsxxxx/redirect.html">15</a>
<a href="https://pagure.io/uweb/raw/master/f/redirect.html#">16</a>
<a href="https://bitbucket.org/torappinfo/torappinfo.bitbucket.io/raw/master/redirect.html#">17</a>
<a href="https://fastly.jsdelivr.net/gh/torappinfo/uweb/redirect.html#">18</a>
<a href="https://dagshub.com/torappinfo/uweb/raw/master/redirect.html#">19</a>
<a href="https://gitgud.io/jamesfengcao/uweb/-/raw/master/redirect.html#">20</a>
<a href="i:0mi:5h?ref=master::https://www.gitlink.org.cn/api/jamesfengcao/uweb/raw/redirect.html">gitlink</a>
<a href="https://gitly.org/jamesfengcao/uweb/raw/master/redirect.html#">gitly</a>
<a href="https://gitnet.fr/jamesfengcao/uweb/raw/branch/master/redirect.html#">gitnet</a>
<a href="https://repo.palemoon.org/jamesfengcao/uweb/raw/branch/master/redirect.html#">palemoon</a>
<a href="https://tildegit.org/jamesfengcao/uweb/raw/branch/master/redirect.html#">tilde</a>
<a href="https://git.cryto.net/jamesfengcao/uweb/raw/branch/master/redirect.html#">cryto</a>
<a href="https://code.antopie.org/jamesfengcao/uweb/raw/branch/master/redirect.html#">antopie</a>
<a href="https://torappinfo.bitbucket.io/zh/">bitbucket</a>
<a href="https://uweb.vercel.app/zh/">vercel</a>
<br><br>
<a href="https://gitee.com/jamesfengcao/uweb">项目主页</a><br>

167
assets/help_zh.html~ Normal file
View file

@ -0,0 +1,167 @@
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width" /><base href=
../zh/
><title>使用攻略</title></head>
<center><b>使用攻略</b> <a href="i:1fhelp_en">English</a></center>
<a href="https://gitee.com/jamesfengcao/uweb/raw/master/zh/index.html#">设置及技巧</a> (
<a href="https://jamesfengcao.atomgit.net/uweb/zh/">atomgit</a>
<a href="https://torappinfo.frama.io/uweb/zh/">frama</a>
<a href="https://jamesfengcao.gitlab.io/uweb/zh/">gitlab</a>
<a href="https://repo.or.cz/uweb.git/blob_plain/HEAD:/zh/index.html">repo</a>
<a href="https://jamesfengcao.codeberg.page/zh/">codeberg</a>
<a href="https://uweb.surge.sh/zh/">surge</a>
<a href="https://torappinfo.github.io/uweb/zh/">github</a>
<a href="https://posh-crab-23.deno.dev/zh/">deno</a>
<a href="https://uwebzh.netlify.app/zh/">netlify</a>
<a href="https://uwebbrowser-t27o4.kinsta.page/zh/">kinsta</a>
<a href="https://uweb.on-fleek.app/zh/">fleek</a>
<a href="https://uweb.onrender.com/zh/">render</a>
<a href="https://torapp.eu.org/zh/">torapp</a>
<a href="https://muweb.pages.dev/zh/">pages</a>
<a href="https://uweb.glitch.me/zh/">glitch</a>
<a href="https://uweb.zeabur.app/zh/">zeabur</a>
<a href="https://uwebbrowser.sourceforge.io">sf</a>
<a href="javascript:" onclick="document.location.hash='#mirrors'">...</a>
)<br>
<b>常用链接::</b><br>
<a href="i:61ver:https://gitee.com/jamesfengcao/uweb/raw/master/latest.html#">检测并下载最新版</a><br>
<a href="i:61:https://repo.or.cz/uweb.git/blob_plain/HEAD:/zh/searchurl/func.html">界面配置及杂项</a>(<a href="i:61:https://gitee.com/jamesfengcao/uweb/raw/master/zh/searchurl/func.html">gitee镜像</a>)<br>
<a href="i:60/data/data/info.torapp.uweb/files/config.html:https://gitee.com/jamesfengcao/uweb/raw/master/zh/searchurl/config.html">高级个性化定制</a><br>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/">内部目录</a>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/bookmark/">分类书签</a>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/offline/">离线网页</a>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/sbookmark/">超级书签</a><br>
<a target="_blank" href="file:///sdcard/Download/">下载</a>
<a target="_blank" href="i:1e">sd卡下载目录</a><br>
<a target="_blank" href="data:text/html;charset=utf-8,<body contenteditable%3E">空白便签</a><br>
<a target="_blank" href="file:///data/data/info.torapp.uweb/files/uweb.log">出错报告</a><br>
<br>
<b>主屏查询举例::</b><br>
在主屏中间输入框或顶部地址栏内输入“牛奶”,再点击上面搜索引擎“值得买”。<br>
<br>
<b>提示::</b>
<ul>
<li>底部工具条更多工具可左右滑动。</li>
<li>连点‘后退’按钮退出当前窗口。</li>
</ul>
<b>顶部工具条::</b><br>
从浏览器顶部往下拉或短按底部工具条页面搜索可显示。<br>
<br>
<b>底部工具条::</b><br>
左/右下角滑动或顶部/地址栏下方下拉可显示。<br>
<ul>
<li>[⟳] 刷新/中断网页;长按出现<a href="javascript:" onclick="document.location.hash='spinneroptions'">功能选择</a></li>
<li>[<-]后退: 长按智能翻页</li>
<li>[->]前进: 无前进历史时智能翻页。长按弹出系统菜单。</li>
<li>[⚙️]设置: 长按显示<a href="javascript:" onclick="document.location.hash='#options'">系统设置</a></li>
<li>[□] 窗口管理;长按打开<a href="globalcss/index.html#">全局用户css样式选项</a>, <a target="_blank" href="file:///data/data/info.torapp.uweb/files/css/">访问目录"css/"</a></li>
<li>[🏠]主屏,长按打开新窗口。</li>
<li>[☰] 更多工具;长按弹出<a href="rjs/index.html#">全局js脚本设置</a>, <a target="_blank" href="file:///data/data/info.torapp.uweb/files/js/">访问目录"js/"</a></li>
</ul>
更多工具:
<ul>
<li>[🖥️]PC: 伪装成桌面浏览器长按则在左上角弹出菜单显示更多用户配置UA<a href=file:///data/data/info.torapp.uweb/files/default.uas>查看default.uas</a></li>
<li>[JS] 关闭/打开javascript支持长按显示<a href="rjs/index.html#">更多脚本功能</a>, <a target="_blank" href="file:///data/data/info.torapp.uweb/files/bookmarklet/">访问目录"bookmarklet/"</a></li>
<li>[IMG] 关闭/打开图像显示;长按显示<a href="urls/index.html#">特色服务</a>, <a href=file:///data/data/info.torapp.uweb/files/default.urls>查看default.urls</a></li>
<li>[☆] 添加书签;长按显示<a href="links/index.html#">常用链接</a>, <a href=file:///data/data/info.torapp.uweb/files/default.link>查看default.link</a></li>
<li>[🕔] 访问历史,长按显示<a href="cmds/index.html#">预定义命令<a>, <a href=file:///data/data/info.torapp.uweb/files/default.cmds>查看default.cmds</a></li>
<li>[🔍]页面搜索:长按唤出<a href="rjs/index.html#">远程脚本菜单</a>, <a href=file:///data/data/info.torapp.uweb/files/default.rjs>查看default.rjs</a></li>
<li>[🔗]复制链接:长按显示<a href="textprocess/index.html#">对选中内容作用户定义操作</a>菜单,<a href=file:///data/data/info.torapp.uweb/files/default.select>查看default.select</a></li>
<li>网址分享:主屏下对剪贴板数据进行<a href="textprocess/index.html#">文本处理</a>。长按显示输入法短语,<a href=file:///data/data/info.torapp.uweb/files/default.input>查看default.input</a>.</li>
<li>[X]退出浏览器</li>
<li>[▽]底部</li>
<li>[△]顶部</li>
<li>[🔊]朗读: 优先朗读顶部工具条搜索栏非网址内容、网页选中内容,最后为整个网页。再次朗读可中断上次朗读操作,地址栏朗读专为学习外语单词发音而设计。</li>
<li>[📃]文本重排</li>
<li>[☁↓]保存在线网页/复制本地内容到目录</li>
<li>[👤]账户切换</li>
</ul>
注:可通过关闭[JS]/[IMG]来屏蔽广告,这种屏蔽方式没有性能损失。<br>
<br>
<b><a id="options">系统设置</a>::</b><br>
<ul>
<li>不良信息拦截:与其它应用不同,此选项拦截一切子域名、孙域名......。<br>
需hosts文件<a href=file:///data/data/info.torapp.uweb/files/default.hosts>default.hosts</a>
每行一个域名。<br>
<a href="adblock/">攻略</a>
</li>
<li>缓存优先:优先使用缓存内容,可在离线状态下访问已缓存网页。</li>
<li>激活用户脚本:首次执行用户脚本后,访问同类网站时会自动执行此脚本,直至清空后台或另一脚本被激活。</li>
<li><a href="sitejs/index.html#">执行网站用户脚本</a></li>
<li>概览模式: 显示完整页面宽度,有时字体会比较小。</li>
<li>离线资源: 使用用户自备数据代替网站内容。</li>
<li>资源嗅探:取消选项时显示嗅探结果。可用<a href=file:///data/data/info.torapp.uweb/files/types.sniff>types.sniff</a>控制嗅探类型,空文件嗅探一切。</li>
<li>弹出视频地址: <a href=file:///data/data/info.torapp.uweb/files/types.sniff>types.sniff</a>控制嗅探类型。</li>
</ul>
<b><a id="spinneroptions">功能选择</a>::</b>
<ul>
<li><a href=file:///data/data/info.torapp.uweb/files/colors.txt>背景色</a></li>
<li>地址栏功能选择,<a href=file:///data/data/info.torapp.uweb/files/default.acmd>查看default.acmd</a></li>
</ul>
<b>书签文件::</b><br>
用户可随意编辑文件<a href=file:///data/data/info.torapp.uweb/files/bookmark.html>bookmark.html</a>插入CSS样式。但最好仍然让每个书签占一行可简化管理。<br>
<br>
<b>长按链接::</b>
<ul>
<li>新窗口打开:当链接为小书签时,小书签将作用于除本窗口外的最后一个窗口。</li>
<li>屏蔽根域名:屏蔽当前链接的根域名,可能的话建议用户取域名的最后两部分。</li>
</ul>
<b>高级配置::</b><br>
点击本页面文件名链接弹出文本编辑器,部分链接为文件目录,长按可显示目录路径; 如果目录存在,点击可进入。使用底部下载按钮复制文件或目录至应用内部目录,可以扩展浏览器功能。
<ul>
<li>如果存在文件<a href=file:///data/data/info.torapp.uweb/files/home5.html>home5.html</a>,就以此为主屏。</li>
<li>运行用户javascript 长按底部工具条[JS]按钮则弹出菜单显示<a target="_blank" href="file:///data/data/info.torapp.uweb/files/bookmarklet/">bookmarklet</a>目录下所有js文件供用户挑选执行。</li>
<li>用户代理(user agent)配置: <a href=file:///data/data/info.torapp.uweb/files/default.uas>default.uas</a>。文件每行以回车结尾,格式为:<br>
[UA名]:[UA字符串]</li>
<li><a href="search/index.html#">搜索引擎配置</a> <a href=file:///data/data/info.torapp.uweb/files/home5.search>home5.search</a>。文件每行以回车结尾,格式为:<br>
[引擎名]:[引擎url] </li>
<li>长按底部工具条[IMG]按钮弹出菜单显示<a href=file:///data/data/info.torapp.uweb/files/default.urls>default.urls</a>中辅助功能,配置文件格式与搜索引擎完全相同,每行格式如下:<br>
[功能名]:[提供功能网址] </li>
</ul>
<b><a id="mirrors">更多镜像</a>::</b><br>
<a href="https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html#">试验1</a>
<a href="https://gitcode.net/uweb/uweb/-/raw/master/redirect.html#">2</a>
<a href="https://raw.gitcode.com/uweb/uweb/raw/master/redirect.html#">4</a>
<a href="https://gitea.com/torappinfo/uweb/raw/branch/master/redirect.html#">5</a>
<a href="i:0mi:5h?format=raw::https://sourceforge.net/p/uwebbrowser/code/ci/master/tree/redirect.html">6</a>
<a href="i:0mi:5h?format=raw::https://rocketgit.com/user/torappinfo/uweb/source/tree/branch/master/blob_download/redirect.html">7</a>
<a href="https://notabug.org/torappinfo/uweb/raw/master/redirect.html#">8</a>
<a href="https://git.launchpad.net/uweb/plain/redirect.html#">9</a>
<a href="https://framagit.org/torappinfo/uweb/-/raw/master/redirect.html#">10</a>
<a href="https://git.froggi.es/jamesfengcao/uweb/raw/branch/master/redirect.html#">12</a>
<a href="https://git.disroot.org/torappinfo/uweb/raw/branch/master/redirect.html#">13</a>
<a href="https://gitdab.com/jamesfengcao/uweb/raw/branch/master/redirect.html#">14</a>
<a href="i:0mi:5h/xxxx/?path=::https://dev.azure.com/jamesfengcao/1d8bf6c7-7c24-4441-bc5e-9709dcaf37fc/_apis/git/repositories/2a588d9b-f25a-46c0-bb3b-f685c635fcf8/itemsxxxx/redirect.html">15</a>
<a href="https://pagure.io/uweb/raw/master/f/redirect.html#">16</a>
<a href="https://bitbucket.org/torappinfo/torappinfo.bitbucket.io/raw/master/redirect.html#">17</a>
<a href="https://fastly.jsdelivr.net/gh/torappinfo/uweb/redirect.html#">18</a>
<a href="https://dagshub.com/torappinfo/uweb/raw/master/redirect.html#">19</a>
<a href="https://gitgud.io/jamesfengcao/uweb/-/raw/master/redirect.html#">20</a>
<a href="i:0mi:5h?ref=master::https://www.gitlink.org.cn/api/jamesfengcao/uweb/raw/redirect.html">gitlink</a>
<a href="https://gitly.org/jamesfengcao/uweb/raw/master/redirect.html#">gitly</a>
<a href="https://gitnet.fr/jamesfengcao/uweb/raw/branch/master/redirect.html#">gitnet</a>
<a href="https://repo.palemoon.org/jamesfengcao/uweb/raw/branch/master/redirect.html#">palemoon</a>
<a href="https://tildegit.org/jamesfengcao/uweb/raw/branch/master/redirect.html#">tilde</a>
<a href="https://git.cryto.net/jamesfengcao/uweb/raw/branch/master/redirect.html#">cryto</a>
<a href="https://code.antopie.org/jamesfengcao/uweb/raw/branch/master/redirect.html#">antopie</a>
<a href="https://torappinfo.bitbucket.io/zh/">bitbucket</a>
<a href="https://uweb.vercel.app/zh/">vercel</a>
<br><br>
<a href="https://gitee.com/jamesfengcao/uweb">项目主页</a><br>

View file

@ -1,188 +1,194 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel> <channel>
<title>_posts on </title> <title>_Posts on uweb browser: unlimited power</title>
<link>/en/_posts/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/_posts/</link>
<description>Recent content in _posts on </description> <description>Recent content in _Posts on uweb browser: unlimited power</description>
<generator>Hugo -- gohugo.io</generator> <generator>Hugo</generator>
<lastBuildDate>Sat, 02 Jul 2022 00:00:00 +0000</lastBuildDate><atom:link href="/en/_posts/index.xml" rel="self" type="application/rss+xml" /> <language>en</language>
<lastBuildDate>Tue, 06 Jan 2026 19:39:18 +0800</lastBuildDate>
<atom:link href="https://jamesfengcao.gitlab.io/uweb/en/_posts/index.xml" rel="self" type="application/rss+xml" />
<item> <item>
<title>Site map</title> <title>Html5 applications</title>
<link>/en/sitemap/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/html5/</link>
<pubDate>Sat, 02 Jul 2022 00:00:00 +0000</pubDate> <pubDate>Tue, 06 Jan 2026 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/html5/</guid>
<guid>/en/sitemap/</guid> <description>&lt;h3 id=&#34;remotelocal-big-txthtmlmd-files-zstgzbr-compressed-optionally-as-search-engines-or-paged-reader&#34;&gt;remote/local big txt/html/md files (.zst,.gz,.br compressed optionally) as search engines or paged reader&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;i:0/js/reader.html:[remote url]#s=%s&lt;/code&gt;&lt;br&gt;&#xA;is the search engine url for remote/local file.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;i:0/js/reader.html:[remote url]&lt;/code&gt;&lt;br&gt;&#xA;is the paged reader for big txt/html files.&lt;/p&gt;&#xA;&lt;p&gt;Users can add a menu item by visiting &lt;a href=&#34;../urls/index.html#&#34;&gt;url services&lt;/a&gt; and clicking the &lt;code&gt;Reader&lt;/code&gt; link. After the menu item is installed and uweb restarts, long pressing any big txt/html/md link --&amp;gt; command --&amp;gt; Reader would load the big file in paged reader, long pressing button &amp;quot;-&amp;gt;&amp;quot; on bottom toolbar --&amp;gt; add as search engine --&amp;gt; change the last part of url from &amp;quot;#p=1&amp;quot; to &amp;quot;#s=%s&amp;quot; and save the engine.&lt;/p&gt;</description>
<description>UI Search engines Home screen Quick start UI (gitee) Backup and restore Customization Bottom toolbar button long pressing menus User agents Javascript Url services Links Commands Remote javascript Menu for selections Menu for long pressing hypertext Toolbar Gestures Font settings Advanced Content AD blocking CSS styles redirection Javascript and CSS for domains Offline cache Tools Bookmarklets Custom file handling Html5 application File manager Tools Termux GNU bc Gnuplot tcron Offline download Miscellaneous Configuration files Plugins Tips Tips Video Debug </description>
</item> </item>
<item> <item>
<title>Configuration folders/files</title> <title>File manager</title>
<link>/en/filenames/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/filemanager/</link>
<pubDate>Thu, 30 Jun 2022 00:00:00 +0000</pubDate> <pubDate>Fri, 05 Dec 2025 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/filemanager/</guid>
<guid>/en/filenames/</guid> <description>&lt;p&gt;Visiting file urls ending with &amp;quot;/&amp;quot; enters internal file manager.&lt;/p&gt;&#xA;&lt;p&gt;When the current tab is internal file manager, visiting file url for a file shows the content of the file, long pressing button &amp;quot;🕔&amp;quot; -&amp;gt; Editor loads line-based editor for the file. If the file does not exist, saving creates a new file.&lt;/p&gt;&#xA;&lt;p&gt;Running any command with address bar with the format &amp;quot;d::command line:&amp;quot; to execute &amp;quot;command line&amp;quot; in the current folder of the internal file manager. Ex:&lt;br&gt;&#xA;&amp;quot;d::touch a.txt:&amp;quot; to create a new file a.txt.&lt;br&gt;&#xA;&amp;quot;d::mkdir subdir:&amp;quot; to create a new folder names &amp;quot;subdir&amp;quot;.&lt;br&gt;&#xA;&amp;quot;d::mv old new:&amp;quot; to rename the file &amp;quot;old&amp;quot; to be &amp;quot;new&amp;quot;.&lt;/p&gt;</description>
<description>All folders end with character &amp;quot;/&amp;quot; and others are files. All folders/files locate in &amp;quot;/data/data/info.torapp.uweb/files&amp;quot;: </item>
&amp;quot;css/&amp;quot;: global css folder <item>
&amp;quot;js/&amp;quot;: global script folder <title>Tips</title>
&amp;quot;sitejs/&amp;quot;: script folder for domains <link>https://jamesfengcao.gitlab.io/uweb/en/tips/</link>
&amp;quot;sitecss/&amp;quot;:CSS folder for domains <pubDate>Fri, 05 Dec 2025 00:00:00 +0000</pubDate>
&amp;quot;bookmarklet/&amp;quot;:bookmarklets, long pressing the &amp;quot;JS&amp;quot; button to execute. <guid>https://jamesfengcao.gitlab.io/uweb/en/tips/</guid>
&amp;quot;offline/&amp;quot;: to save offline pages <description>&lt;p&gt;&lt;strong&gt;Address bar autocompletion as input method when starting with space&lt;/strong&gt;&lt;br&gt;&#xA;When address bar text starts with space, the autocompletion selection is inserted to the focused element on the web page. It could be used to choose AI prompts.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Text processing for clipboard data&lt;/strong&gt;&lt;br&gt;&#xA;On home screen, pressing the sharing button of the bottom toolbar popups the &lt;a href=&#34;../textprocess/index.html#&#34;&gt;text processing menu&lt;/a&gt; for clipboard data.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;To show web pages in desktop mode&lt;/strong&gt;&lt;br&gt;&#xA;PC button + option &amp;quot;wide viewport&amp;quot; + global js &amp;quot;force page resizable&amp;quot;.&lt;br&gt;&#xA;If some dialog is wider than the screen, press &amp;quot;📄&amp;quot; on the bottom toolbar.&lt;/p&gt;</description>
&amp;quot;sbookmark/&amp;quot;: to save super bookmarks </item>
&amp;quot;sitecache/&amp;quot;:offline cache <item>
&amp;quot;longclick/&amp;quot;: menus to appear when long-pressing hypertext (js files) <title>Phrases and input method</title>
&amp;quot;icon/&amp;quot;:customized icons <link>https://jamesfengcao.gitlab.io/uweb/en/input/</link>
&amp;quot;app[XXX]/&amp;quot;:html5 applications <pubDate>Tue, 28 Oct 2025 00:00:00 +0000</pubDate>
&amp;quot;default.longclick&amp;quot;: to configure menus when long-pressing hypertext.</description> <guid>https://jamesfengcao.gitlab.io/uweb/en/input/</guid>
<description>&lt;h4 id=&#34;defaultinput&#34;&gt;&amp;quot;default.input&amp;quot;&lt;/h4&gt;&#xA;&lt;p&gt;Click the following links to install menus popped by long pressing the share button (with arrow-out-of-square as icon) on the bottom toolbar:&lt;br&gt;&#xA;&lt;a href=&#34;i:0gdefault.input::@AddrBar%0A&#34;&gt;Address Bar&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;i:0gdefault.input::%20\n%0A&#34;&gt;New line&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;i:0gdefault.input::@^Z@%1A%0A&#34;&gt;CTRL-Z: undo&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;i:0gdefault.input::@^Y@%19%0A&#34;&gt;CTRL-Y: redo&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Long pressing the share button in &lt;a href=&#34;../index.html#&#34;&gt;uweb browser&lt;/a&gt; will popup menus defined in file &amp;quot;default.input&amp;quot;, each line of which defines common phrase for user inputs. If the phrase begins with &amp;quot;@xxxx@&amp;quot;, then &amp;quot;xxxx&amp;quot; part is the alias for the rest part of the string. Alias could be used for non-printable phrases.&lt;/p&gt;</description>
</item>
<item>
<title>Context menu</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/longclick/</link>
<pubDate>Sat, 01 Mar 2025 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/longclick/</guid>
<description>&lt;h4 id=&#34;the-command-submenus&#34;&gt;The &amp;quot;command&amp;quot; submenus&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;File &amp;quot;&lt;a href=&#34;../links/index.html#&#34;&gt;image.link&lt;/a&gt;&amp;quot;: defines &amp;quot;command&amp;quot; submenus of the context menu for images.&lt;/li&gt;&#xA;&lt;li&gt;File &amp;quot;&lt;a href=&#34;../links/index.html#&#34;&gt;download.link&lt;/a&gt;&amp;quot;: &amp;quot;command&amp;quot; submenus for download options menu.&lt;/li&gt;&#xA;&lt;li&gt;File &amp;quot;context.link&amp;quot;: &amp;quot;command&amp;quot; submenus in all other cases.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The &amp;quot;command&amp;quot; submenus can be toggled with &lt;a href=&#34;i:61:../searchurl/func.html&#34;&gt;UI options&lt;/a&gt;. The &amp;quot;command&amp;quot; submenus are default ( service urls or image.link or download.link), links, commands or service urls (default.urls when both link and command options are ticked).&lt;/p&gt;&#xA;&lt;h4 id=&#34;to-run-commands&#34;&gt;To run commands&lt;/h4&gt;&#xA;&lt;p&gt;Each line of file &amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/default.longclick&#34;&gt;default.longclick&lt;/a&gt;&amp;quot; has the following format: (same as &lt;a href=&#34;../cmds/index.html#&#34;&gt;default.cmds&lt;/a&gt;)&lt;br&gt;&#xA;[Name]:[mimetype]:[command line]&lt;br&gt;&#xA;in which [command line] can have &lt;a href=&#34;../cmds/index.html#&#34;&gt;&amp;quot;%c&amp;quot; (cookie), &amp;quot;%u&amp;quot; (current url), &amp;quot;%t&amp;quot; (title)&lt;/a&gt; etc.&lt;/p&gt;</description>
</item>
<item>
<title>CSS styles</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/globalcss/</link>
<pubDate>Sun, 13 Oct 2024 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/globalcss/</guid>
<description>&lt;p&gt;&lt;a href=&#34;../index.html#&#34;&gt;Uweb browser&lt;/a&gt; loads all &amp;quot;.css&amp;quot; files under the folder &amp;quot;css&amp;quot; as global css. Click the following links to install global css files:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0hcss/clearfont.css:../../zh/searchurl/txt/clearfont.css&#34;&gt;Clearing font settings&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The file &amp;quot;night.css&amp;quot; is used as night mode, click the following links to install one:&lt;br&gt;&#xA;&lt;a href=&#34;i:0hnight.css:../../zh/searchurl/txt/night.css&#34;&gt;webview 81+ night mode&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;i:0hnight.css:../../zh/searchurl/txt/night_old.css&#34;&gt;webview 80- night mode&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;earliest-loaded-global-js&#34;&gt;Earliest loaded global js&lt;/h4&gt;&#xA;&lt;p&gt;The &amp;quot;.js&amp;quot; files under the folder &amp;quot;css&amp;quot; are loaded as earlier as possible on the page.&lt;/p&gt;&#xA;&lt;p&gt;Click the following links to install early loaded global js:&lt;br&gt;&#xA;&lt;a href=&#34;i:0hcss/nojscopy.js::document.addEventListener(%22copy%22,(e)=&gt;{e.preventDefault()})&#34;&gt;No webpage clipboard copy&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
<title>Text selection/processing</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/textprocess/</link>
<pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/textprocess/</guid>
<description>&lt;p&gt;Click the following links to install menus for long pressing the button &lt;code&gt;link&lt;/code&gt;:&lt;br&gt;&#xA;&lt;a href=&#34;i:0gdefault.select::Share:/uwebS:%0A&#34;&gt;Share&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::Edit:/text/html:echo -n %22%3cmeta charset=utf-8%3e%3cbody contenteditable%3e%22;cat%0A&#34;&gt;Edit&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::AddrBar:/uwebAddr:%0A&#34;&gt;Copy text to address bar&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::notems:/uwebA:printf i:0/js/hash2textarea.js:https://note.ms/ric#;cat%0A&#34;&gt;note.ms: cloud text sharing, please replace &amp;quot;ric&amp;quot; with your favorite ID&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::copyHtml:html/clip:%0A&#34;&gt;Copy selected text with html format to clipboard&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::Home:/uweb:printf file://data/data/info.torapp.uweb/files/home5.search%5C location.href=%5C%22i:15;cat;printf %5C%22%0A&#34;&gt;Search with home screen&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::google Translate:/uweb:printf &#39;https://translate.google.com/?sl=auto&amp;tl=en&amp;op=translate&amp;text=&#39;;cat|tr &#39; &#39; &#39;%2B&#39;%0A&#34;&gt;google Translate&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::bing Translate:/uweb:printf &#39;https://cn.bing.com/translator/?from=&amp;to=en&amp;text=&#39;;cat|tr &#39; &#39; &#39;%2B&#39;%0A&#34;&gt;bing translate&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::deepL:/uweb:printf https://www.deepl.com/translator-mobile#auto/en/;cat|sed &#39;s/ /%2520/g&#39;%0A&#34;&gt;deepL&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The file &lt;code&gt;default.select&lt;/code&gt; defines text processing menus for selected text. If no text is selected, the menu item operates on the whole page. Each line of the file has the following format:&lt;br&gt;&#xA;[Name]:[mimetype]:[command line]&lt;/p&gt;</description>
</item> </item>
<item> <item>
<title>Links</title> <title>Links</title>
<link>/en/links/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/links/</link>
<pubDate>Thu, 30 Jun 2022 00:00:00 +0000</pubDate> <pubDate>Sat, 28 Oct 2023 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/links/</guid>
<guid>/en/links/</guid> <description>&lt;h4 id=&#34;context-menu&#34;&gt;Context menu&lt;/h4&gt;&#xA;&lt;p&gt;The configuration file &lt;code&gt;image.link&lt;/code&gt;, &lt;code&gt;download.link&lt;/code&gt; and &lt;code&gt;context.link&lt;/code&gt; define the default &lt;code&gt;command&lt;/code&gt; submenu of the context menus when a url link is long pressed.&lt;/p&gt;&#xA;&lt;h5 id=&#34;context-menu-for-images&#34;&gt;Context menu for images&lt;/h5&gt;&#xA;&lt;p&gt;Click the following links to install &lt;code&gt;command&lt;/code&gt; submenu for image&#39;s context menu:&lt;br&gt;&#xA;&lt;a href=&#34;i:0gimage.link::google:https://www.google.com/searchbyimage?image_url=%25u0A&#34;&gt;google image&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gimage.link::tineye:https://tineye.com/search?url=%25u0A&#34;&gt;tineye&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gimage.link::yandex:https://yandex.com/images/search?family=yes&amp;rpt=imageview&amp;url=%25u0A&#34;&gt;yandex image&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h5 id=&#34;download-options-menu---command&#34;&gt;Download options menu -&amp;gt; &lt;code&gt;command&lt;/code&gt;&lt;/h5&gt;&#xA;&lt;p&gt;Click the following links to install &lt;code&gt;command&lt;/code&gt; submenu for &lt;b&gt;download options menu&lt;/b&gt;:&lt;br&gt;&#xA;&lt;a href=&#34;i:0gdownload.link::pager:i:0m/js/view.html:%25u#p=1%0A&#34;&gt;huge txt pager&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdownload.link::pager_2lnk:i:0m/js/view.html#/js/2lnk.js:%25u#p=1%0A&#34;&gt;pager with urls converted to links&lt;/a&gt;&lt;/p&gt;</description>
<description>Clicking the following hypertext will install menus for long pressing the bookmark button (with star as icon): </item>
Certificate info <item>
Web fullscreen <title>Cron</title>
Long pressing the bookmark button in uweb browser will popup menus defined in file &amp;quot;default.link&amp;quot;. The file format is as follows: <link>https://jamesfengcao.gitlab.io/uweb/en/tcron/</link>
[Menu name]:[url][space][javascript code] <pubDate>Wed, 25 Oct 2023 00:00:00 +0000</pubDate>
in which space and later parts are optional. url and later parts support &amp;quot;%u&amp;quot;,&amp;quot;%s&amp;quot; etc.. The javascript code will be executed after url is fully loaded.</description> <guid>https://jamesfengcao.gitlab.io/uweb/en/tcron/</guid>
<description>&lt;h4 id=&#34;crontab-with-enhanced-semantics&#34;&gt;crontab (with enhanced semantics)&lt;/h4&gt;&#xA;&lt;p&gt;Some battery restrictions on android 13+ may disallow new instance of uweb browser by alarm events. Users can either keep uweb instance (no battery consumption) or remove the restriction for uweb.&lt;/p&gt;&#xA;&lt;p&gt;For performance, the file &amp;quot;crontab&amp;quot; uses single space as field separator. Letters are not suppored currently. So use &amp;quot;1&amp;quot; for &amp;quot;January&amp;quot; and 2 for &amp;quot;Tuesday&amp;quot; etc.&lt;/p&gt;&#xA;&lt;p&gt;The sixth field in crontab file could be in the format of &lt;a href=&#34;../links/index.html#&#34;&gt;internal links&lt;/a&gt;. Specifically, &amp;quot;c:&amp;quot; to execute the following commands in termux and &amp;quot;!&amp;quot; to execute commands directly. If the sixth field is not in any of above formats, then the field will appear as the message of alarm clock.&lt;/p&gt;</description>
</item>
<item>
<title>Offline resources</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/offlinecache/</link>
<pubDate>Tue, 11 Apr 2023 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/offlinecache/</guid>
<description>&lt;p&gt;Offline resources locate in the folder &amp;quot;sitecache&amp;quot;. With the option &amp;quot;use offline resources&amp;quot; enabled, the corresponding files in &amp;quot;sitecache/[domain name]/[full path including filename, the url path part]&amp;quot; are loaded first before reaching the network.&lt;/p&gt;&#xA;&lt;h4 id=&#34;serverless-local-sites&#34;&gt;Serverless local sites&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:01Extract webapp:i:0bsitecache/local/:&#34;&gt;Click to install url service that extracts web apps to the folder &amp;quot;sitecache/local/&amp;quot;&lt;/a&gt;: support web extensions (.crx for chrome &amp;amp; .xpi for firefox).&lt;/p&gt;&#xA;&lt;p&gt;Any folder under &amp;quot;sitecache&amp;quot; can be visited as a local site. Urls with search queries can be dynamically processed by the js/wasm code in the local file.&lt;/p&gt;</description>
</item>
<item>
<title>Resource redirection</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/redirect/</link>
<pubDate>Tue, 11 Apr 2023 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/redirect/</guid>
<description>&lt;p&gt;⚠️&lt;span style=&#34;color:red&#34;&gt;Redirection forwards cookies&lt;/span&gt; with the setting option &amp;quot;Redirect cookies&amp;quot; enabled, so use the option with care.&lt;/p&gt;&#xA;&lt;h4 id=&#34;setting-options-url-redirection-vs-resource-redirection&#34;&gt;Setting options: &amp;quot;Url redirection&amp;quot; vs. &amp;quot;Resource redirection&amp;quot;&lt;/h4&gt;&#xA;&lt;p&gt;&amp;quot;Url redirection&amp;quot; redirects the main/page url only while &amp;quot;Resource redirection&amp;quot; is for all urls in the page.&lt;/p&gt;&#xA;&lt;h4 id=&#34;global-redirection&#34;&gt;Global redirection&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:60/data/data/info.torapp.uweb/files/config.html:https://jamesfengcao.codeberg.page/en/searchurl/config.html&#34;&gt;Global redirection&lt;/a&gt; is enabled with the setting option &amp;quot;Resource redirection&amp;quot; or both &amp;quot;Url redirection&amp;quot; and &amp;quot;Redirect cookies&amp;quot;.&lt;/p&gt;&#xA;&lt;p&gt;When a valid global redirection url is set, the &amp;quot;default.redirect&amp;quot; has no effect, and any url resource is fetched with the new url by appending the original url to the global redirection url.&lt;/p&gt;</description>
</item>
<item>
<title>Hosts files</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/adblock_domain/</link>
<pubDate>Mon, 20 Mar 2023 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/adblock_domain/</guid>
<description>&lt;p&gt;The enhanced hosts files &amp;quot;hosts&amp;quot; and &amp;quot;default.hosts&amp;quot; take effect with the setting option &amp;quot;use hosts&amp;quot;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;hosts&#34;&gt;hosts&lt;/h4&gt;&#xA;&lt;p&gt;The &lt;span style=&#34;color:red&#34;&gt;enhanced&lt;/span&gt; file &lt;a href=&#34;file:///data/data/info.torapp.uweb/files/hosts&#34;&gt;&amp;quot;hosts&amp;quot;&lt;/a&gt; defines IP addresses/attributes for domains. Each line has the following format:&lt;br&gt;&#xA;[[IP address][attributes]][single space][domain name]&lt;/p&gt;&#xA;&lt;p&gt;where &amp;quot;[[IP address][attributes]]&amp;quot; could be:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ipv4 address such as:&lt;br&gt;&#xA;172.67.157.211 torapp.eu.org&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ipv6 address, Ex.:&lt;br&gt;&#xA;[2606:4700:3037::6815:8c3] torapp.eu.org&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;empty, that would lift all server-imposed limitations. Ex.:&lt;br&gt;&#xA;[single space]gitee.com&lt;/p&gt;&#xA;&lt;p&gt;which will make all git repositories on the domain visitable as websites with raw file access url.&lt;/p&gt;</description>
</item>
<item>
<title>JS/CSS/HTML/preprocessing for domains</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/sitejs/</link>
<pubDate>Sat, 28 Jan 2023 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/sitejs/</guid>
<description>&lt;h3 id=&#34;javascript-load-when-page-completes-earliest-loaded-js-should-use-sitecss&#34;&gt;Javascript (load when page completes, earliest loaded JS should use sitecss).&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Need to be named as &amp;quot;[domain root].js&amp;quot;, such as &amp;quot;yahoo.com.js&amp;quot; or &amp;quot;finance.yahoo.com.js&amp;quot;. The script will be loaded on the whole domain tree sites. If several files matches the domain, then the script with longest file name is loaded.&lt;/li&gt;&#xA;&lt;li&gt;Script must be put under the folder &amp;quot;sitejs&amp;quot; or &amp;quot;/data/data/info.torapp.uweb/files/sitejs&amp;quot;. The later folder has the priority.&lt;/li&gt;&#xA;&lt;li&gt;Long press the button &amp;quot;settings&amp;quot;, check the option &amp;quot;Run user scripts&amp;quot;.&lt;/li&gt;&#xA;&lt;li&gt;Support 2/3-segment domains. If the length of the last 2-segments of domain is less than 7 (ex. &amp;quot;com.pl&amp;quot;), then it is treated as one segment.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;css-style-and-earliest-loaded-js&#34;&gt;CSS style and earliest loaded JS&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Need to be named as &amp;quot;[domain root].css&amp;quot;, such as yahoo.com.css or finance.yahoo.com.css。&lt;/li&gt;&#xA;&lt;li&gt;Under folder &amp;quot;sitecss&amp;quot;.&lt;/li&gt;&#xA;&lt;li&gt;&amp;quot;[domain root].js&amp;quot; is loaded at the earliest time.&lt;/li&gt;&#xA;&lt;li&gt;Long press the button &amp;quot;settings&amp;quot;, check the option &amp;quot;Apply user styles&amp;quot;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;If file &amp;quot;default.css&amp;quot; exists, the style will be applied to all sites not matching [domain root].css.&lt;/p&gt;</description>
</item>
<item>
<title>Bookmarks</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/bookmark/</link>
<pubDate>Mon, 16 Jan 2023 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/bookmark/</guid>
<description>&lt;p&gt;AI, chatgpt etc.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://aistudio.google.com/app/prompts/new_chat&#34;&gt;google&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gemini.google.com/app&#34;&gt;google gemini&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://jeeves.ai/chat&#34;&gt;jeeves&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://poe.com&#34;&gt;poe&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.teach-anything.com/&#34;&gt;teach-anything&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://magickpen.com/&#34;&gt;magickpen&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Scholar:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lumina.sh&#34;&gt;Lumina&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://note.ms&#34;&gt;note.ms&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://rentry.org&#34;&gt;rentry&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;i:1w&#34;&gt;Wait for url from other devices&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://berify.com&#34;&gt;berify: reverse image search for video&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;associated-bookmarks&#34;&gt;Associated bookmarks&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;../searchcat/index.html#&#34;&gt;Search engine files&lt;/a&gt; associate with bookmarks with extension &amp;quot;.html&amp;quot;, which means the bookmark file if existing is appended to the page when the search engine file is on screen.&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot;help_en.html&amp;quot; bookmark associates with the user manual in English. Similarly, &amp;quot;help_zh.html&amp;quot; is for Chinese manual. Whenever user manual is open, the associated bookmark appears before the manual.&lt;/p&gt;</description>
</item>
<item>
<title>Address bar command line</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/acmd/</link>
<pubDate>Sun, 08 Jan 2023 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/acmd/</guid>
<description>&lt;h3 id=&#34;--or--command-line&#34;&gt;&amp;quot;:!&amp;quot; ( or &amp;quot;!&amp;quot;) command line&lt;/h3&gt;&#xA;&lt;p&gt;Pressing &amp;quot;:&amp;quot; or &amp;quot;!&amp;quot; with hardware keyboard sets focus on the address bar.&lt;br&gt;&#xA;The command line could be a &amp;quot;.js&amp;quot;, &amp;quot;.sh&amp;quot; or other executable with arguments. Ex. &amp;quot;:!s g keyword&amp;quot; could invoke &amp;quot;s.js&amp;quot; executable with the whole string as arguments (&amp;quot;s.sh&amp;quot; or &amp;quot;s&amp;quot; if file exists, here &amp;quot;g&amp;quot; as google search engine); &amp;quot;:! g keyword&amp;quot; would invoke the file &amp;quot;.js&amp;quot; or &amp;quot;.sh&amp;quot; as executable.&lt;/p&gt;</description>
</item>
<item>
<title>Any url as website</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/url2site/</link>
<pubDate>Sun, 30 Oct 2022 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/url2site/</guid>
<description>&lt;p&gt;The &lt;a href=&#34;../index.html#&#34;&gt;uweb&lt;/a&gt; internal link &amp;quot;&lt;a href=&#34;../links/index.html&#34;&gt;i:0m&lt;/a&gt;&amp;quot; make any url such as download or indirect links visitable as a website. The second part of &lt;a href=&#34;../mirrors/index.html#&#34;&gt;mirrors&lt;/a&gt; has examples using the following tricks:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&amp;quot;i:0m04:[url]&amp;quot;: to treat the [url] content as html with bookmarklet.&lt;/li&gt;&#xA;&lt;li&gt;&amp;quot;i:0m?:[url]&amp;quot;: to treat the [url] content as html, handling css/js properly.&lt;/li&gt;&#xA;&lt;li&gt;&amp;quot;i:0m?[postfix]:[url]&amp;quot;: auto append query postfix to url to retrieve content.&lt;/li&gt;&#xA;&lt;li&gt;&amp;quot;i:0mi:5h:[url]&amp;quot;: similar to &amp;quot;i:0m?:[url]&amp;quot;, to treat the [url] content as html (for download or no-script links etc.)&lt;/li&gt;&#xA;&lt;li&gt;&amp;quot;i:0mi:5h?[postfix]::[url]&amp;quot;: similar to &amp;quot;i:0m?[postfix]:[url]&amp;quot;. auto append query postfix to url to retrieve content.&lt;/li&gt;&#xA;&lt;li&gt;&amp;quot;i:0mi:5h/[regex]/[replacement]::[url]&amp;quot;: use the result of regular expression replacement to retrieve the content.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For more complicated links such as cloud storage shared links, which need user gestures to reach temporary generated content link, use&lt;br&gt;&#xA;&amp;quot;i:0m/.../[local.html]:[url]&amp;quot;, where the local file &amp;quot;/.../[local.html]&amp;quot; processes &amp;quot;[url]&amp;quot; as needed.&lt;/p&gt;</description>
</item>
<item>
<title>Configuration folders/files</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/filenames/</link>
<pubDate>Thu, 30 Jun 2022 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/filenames/</guid>
<description>&lt;p&gt;All folders end with character &amp;quot;/&amp;quot; and others are files. All folders/files locate in &amp;quot;/data/data/info.torapp.uweb/files&amp;quot;:&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/css/&#34;&gt;css/&lt;/a&gt;&amp;quot;: &lt;a href=&#34;../globalcss/index.html#&#34;&gt;global css folder&lt;/a&gt;&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/js/&#34;&gt;js/&lt;/a&gt;&amp;quot;: &lt;a href=&#34;../rjs/index.html#&#34;&gt;global script folder&lt;/a&gt;&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/sitejs/&#34;&gt;sitejs/&lt;/a&gt;&amp;quot;: &lt;a href=&#34;../sitejs/index.html#&#34;&gt;script folder for domains&lt;/a&gt;&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/sitecss/&#34;&gt;sitecss/&lt;/a&gt;&amp;quot;:&lt;a href=&#34;../sitejs/index.html#&#34;&gt;CSS folder for domains&lt;/a&gt;&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/bookmarklet/&#34;&gt;bookmarklet/&lt;/a&gt;&amp;quot;:&lt;a href=&#34;../rjs/index.html#&#34;&gt;bookmarklets&lt;/a&gt;, long pressing the &amp;quot;JS&amp;quot; button to execute.&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/offline/&#34;&gt;offline/&lt;/a&gt;&amp;quot;: to save offline pages&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/sbookmark/&#34;&gt;sbookmark/&lt;/a&gt;&amp;quot;: to save super bookmarks&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/sitecache/&#34;&gt;sitecache/&lt;/a&gt;&amp;quot;:&lt;a href=&#34;../offlinecache/index.html#&#34;&gt;offline cache&lt;/a&gt;&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/longclick/&#34;&gt;longclick/&lt;/a&gt;&amp;quot;: menus to appear when long-pressing hypertext (js files)&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/icon/&#34;&gt;icon/&lt;/a&gt;&amp;quot;:&lt;a href=&#34;../icons/index.html#&#34;&gt;customized icons&lt;/a&gt;&lt;br&gt;&#xA;&amp;quot;app[XXX]/&amp;quot;:&lt;a href=&#34;../html5/index.html#&#34;&gt;html5 applications&lt;/a&gt;&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/default.longclick&#34;&gt;default.longclick&lt;/a&gt;&amp;quot;: to configure menus when long-pressing hypertext.&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/default.uas&#34;&gt;default.uas&lt;/a&gt;&amp;quot;:user agents&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/default.bml&#34;&gt;default.bml&lt;/a&gt;&amp;quot;:&lt;a href=&#34;../rjs/index.html#&#34;&gt;bookmarklets&lt;/a&gt;, long pressing the &amp;quot;JS&amp;quot; button to execute.&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/default.urls&#34;&gt;default.urls&lt;/a&gt;&amp;quot;:&lt;a href=&#34;../urls/index.html#&#34;&gt;service urls&lt;/a&gt;&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/default.acmd&#34;&gt;default.acmd&lt;/a&gt;&amp;quot;:configure address bar functionalities&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/hosts&#34;&gt;hosts&lt;/a&gt;&amp;quot;: for local &lt;a href=&#34;../adblock_domain/index.html#&#34;&gt;domain name attributes&lt;/a&gt;, only single space is allowed to separate ip address and domain name.&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/default.hosts&#34;&gt;default.hosts&lt;/a&gt;&amp;quot;:&lt;a href=&#34;../adblock/index.html#&#34;&gt;hosts not allowed to visit&lt;/a&gt;&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/default.redirect&#34;&gt;default.redirect&lt;/a&gt;&amp;quot;:&lt;a href=&#34;../redirect/index.html#&#34;&gt;redirect websites&lt;/a&gt;&lt;br&gt;&#xA;&amp;quot;&lt;a href=&#34;file:///data/data/info.torapp.uweb/files/default.cmds&#34;&gt;default.cmds&lt;/a&gt;&amp;quot;:&lt;a href=&#34;../cmds/index.html#&#34;&gt;commands&lt;/a&gt;&lt;/p&gt;</description>
</item> </item>
<item> <item>
<title>AD blocking</title> <title>AD blocking</title>
<link>/en/adblock/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/adblock/</link>
<pubDate>Sat, 25 Jun 2022 00:00:00 +0000</pubDate> <pubDate>Sat, 25 Jun 2022 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/adblock/</guid>
<guid>/en/adblock/</guid> <description>&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;../adblock_domain/index.html#&#34;&gt;Host blocking&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use &lt;a href=&#34;../bookmarklet/index.html#&#34;&gt;bookmarklet &amp;quot;list all script urls&amp;quot;&lt;/a&gt; to generate url links, long pressing dubious script (usually 3rd-party library) link, click &amp;quot;Block domain root&amp;quot;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;../sitejs/index.html#&#34;&gt;Javascript and CSS for domains&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Long press the button &amp;quot;js&amp;quot;, click the menu &amp;quot;MarkAD mode&amp;quot;. In &amp;quot;markAD mode&amp;quot;, click page element to show all attributes and generate CSS AD blocking styles. By default, &amp;quot;display:none&amp;quot; is used. If &amp;quot;display&amp;quot; appears in the attribute information, recommend to use &amp;quot;transform:scale(0)!important&amp;quot; instead.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Long press the tab manager button, check &amp;quot;Videos only&amp;quot; for video sites and &amp;quot;Images only&amp;quot; for image sites. Other AD blocking options are &amp;quot;Hide pseudo elements&amp;quot; and &amp;quot;Hide iframes&amp;quot;.&lt;/p&gt;</description>
<description>Host blocking。
Use bookmarklet &amp;quot;list all script urls&amp;quot; to generate url links, long pressing dubious script (usually 3rd-party library) link, click &amp;quot;Block domain root&amp;quot;. Javascript and CSS for domains。
Long press the button &amp;quot;js&amp;quot;, click the menu &amp;quot;MarkAD mode&amp;quot;. In &amp;quot;markAD mode&amp;quot;, click page element to show all attributes and generate CSS AD blocking styles. By default, &amp;quot;display:none&amp;quot; is used. If &amp;quot;display&amp;quot; appears in the attribute information, recommend to use &amp;quot;transform:scale(0)!</description>
</item> </item>
<item> <item>
<title>Bookmarklets</title> <title>Bookmarklets</title>
<link>/en/bookmarklet/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/bookmarklet/</link>
<pubDate>Fri, 24 Jun 2022 00:00:00 +0000</pubDate> <pubDate>Fri, 24 Jun 2022 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/bookmarklet/</guid>
<guid>/en/bookmarklet/</guid> <description>&lt;p&gt;With &lt;a href=&#34;../index.html#&#34;&gt;uweb browser&lt;/a&gt;, long pressing any bookmarklet link, click &amp;quot;Open in new tab&amp;quot;, the bookmarklet will be run on the last other tab.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;javascript:{let es=document.getElementsByTagName(&#39;script&#39;);let urls=&#39;&#39;;for(let i=0;i&lt;es.length;i++){if(es[i].src)urls+=es[i].src+&#39;&lt;br&gt;&#39;;}let w=window.open(&#39;&#39;),s=w.document;s.write(urls);s.close();w.location.href=&#39;i:631:&#39;;}&#34;&gt;List all script urls&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a target=&#34;_self&#34; href=&#34;javascript:alert(navigator.userAgent)&#34;&gt;User agent&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;javascript:(function(){var w=window.open(&#39;&#39;),s=w.document;s.write(&#39;&lt;html&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt;&#39;);s.close();var pre=s.body.appendChild(s.createElement(&#39;pre&#39;));pre.style.overflow=&#39;auto&#39;;pre.style.whiteSpace=&#39;pre-wrap&#39;;pre.appendChild(s.createTextNode(document.cookie))})()&#34;&gt;Cookie&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;javascript:(function(){var w=window.open(&#39;&#39;),s=w.document;s.write(&#39;&lt;html&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt;&#39;);s.close();var pre=s.body.appendChild(s.createElement(&#39;pre&#39;));pre.style.overflow=&#39;auto&#39;;pre.style.whiteSpace=&#39;pre-wrap&#39;;pre.appendChild(s.createTextNode(document.documentElement.innerHTML))})()&#34;&gt;Source code&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;javascript:function%20gett(w){try{var%20lm=new%20Date(w.document.lastModified);if(lm&gt;maxd)maxd=lm;for(var%20i=0;F=w.frames[i];i++){gett(F);}}catch(e){}}var%20now=new%20Date();var%20maxd=new%20Date(document.lastModified);gett(window);if(maxd.getTime()==0||now.toUTCString()==maxd.toUTCString()){alert(&#39;Page%20is%20dynamically%20generated,%20cannot%20determine%20date.&#39;);}else{alert(&#39;Page%20was%20last%20modified%20&#39;+maxd.toLocaleString());}&#34; class=&#34;bookmarklet&#34; rel=&#34;nofollow&#34;&gt;Last modified date&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;javascript:(function(){var script=document.createElement(&#39;script&#39;);script.src=&#39;//fastly.jsdelivr.net/npm/eruda&#39;;document.body.appendChild(script);script.onload=function(){eruda.init()}})()&#34;&gt;Eruda: mobile console&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;javascript:window.open(&#39;https://api.qrserver.com/v1/create-qr-code/?size=150x150&amp;data=&#39;%20+%20decodeURIComponent(location.href));void(0);&#34;&gt;QR code generation&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;javascript:(function(){var x,i; x = document.forms; for (i = 0; i &amp;lt; x.length; ++i) x[i].method=&amp;quot;get&amp;quot;; alert(&amp;quot;Changed &amp;quot; + x.length + &amp;quot; forms to use the GET method. After submitting a form from this page, you should be able to bookmark the result.&amp;quot;); })();&#34;&gt;Use &amp;quot;GET&amp;quot; method for &amp;quot;POST&amp;quot;&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;javascript:(function(){var i,f,j,e,div,label,ne; for(i=0;f=document.forms[i];++i)for(j=0;e=f[j];++j)if(e.type==&amp;quot;hidden&amp;quot;){ D=document; function C(t){return D.createElement(t);} function A(a,b){a.appendChild(b);} div=C(&amp;quot;div&amp;quot;); label=C(&amp;quot;label&amp;quot;); A(div, label); A(label, D.createTextNode(e.name + &amp;quot;: &amp;quot;)); e.parentNode.insertBefore(div, e); e.parentNode.removeChild(e); ne=C(&amp;quot;input&amp;quot;);/*for ie*/ ne.type=&amp;quot;text&amp;quot;; ne.value=e.value; A(label, ne); --j;}})()&#34;&gt;Shows all form elements&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;javascript:(function(){var x,k,f,j;x=document.forms;for (k=0;k&amp;lt;x.length;++k){f=x[k];for(j=0;j&amp;lt;f.length;++j){f[j].disabled=false; f[j].readOnly=false;}}})()&#34;&gt;Enables all form elements&lt;/a&gt;&lt;/p&gt;</description>
<description>With a href=&amp;quot;../index.html&amp;quot;&amp;gt;uweb browser, long pressing any bookmarklet link, click &amp;quot;Open in new tab&amp;quot;, the bookmarklet will be run on the last other tab.
List all script urls
User agent
Cookie
Source code
Last modified date
Eruda: mobile console
QR code generation
Use &amp;quot;GET&amp;quot; method for &amp;quot;POST&amp;quot;
Shows all form elements
Enables all form elements
Toggle checkboxes
Check all checkboxes
Uncheck all checkboxes
Toggle all checkboxes in forms
Enable selection</description>
</item> </item>
<item>
<title>Text selection</title>
<link>/en/pccopy/</link>
<pubDate>Sat, 23 Apr 2022 00:00:00 +0000</pubDate>
<guid>/en/pccopy/</guid>
<description>Click the following links to install menus for long pressing the button &amp;quot;link&amp;quot;:
google Translate
bing translate
deepL
The file &amp;quot;default.select&amp;quot; defines menus for selected text. If no text is selected, the menu item operates on the whole page. Each line of the file has the following format:
[Name]:[mimetype]:[command line]
[mimetype] specifies input/output for [command line].
It formats as &amp;quot;[input mimetype]/[output mimetype]&amp;quot;.
[input mimetype] can be the following:
&amp;quot;html&amp;quot;: rich text &amp;quot;&amp;quot; (empty): text &amp;quot;.</description>
</item>
<item>
<title>CSS样式</title>
<link>/en/globalcss/</link>
<pubDate>Sun, 03 Apr 2022 00:00:00 +0000</pubDate>
<guid>/en/globalcss/</guid>
<description>Uweb browser loads all &amp;quot;.css&amp;quot; files under the folder &amp;quot;css&amp;quot; as global css. Click the following links to install global css files:
Clearing font settings
The file &amp;quot;night.css&amp;quot; is used as night mode, click the following links to install one:
webview 81+ night mode
webview 80- night mode</description>
</item>
<item> <item>
<title>Toolbar customization</title> <title>Toolbar customization</title>
<link>/en/icons/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/icons/</link>
<pubDate>Sun, 06 Feb 2022 00:00:00 +0000</pubDate> <pubDate>Sun, 06 Feb 2022 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/icons/</guid>
<guid>/en/icons/</guid> <description>&lt;p&gt;If subfolder &amp;quot;icon&amp;quot; exists, then files named as &amp;quot;0&amp;quot;,&amp;quot;1&amp;quot;,&amp;quot;2&amp;quot;...&lt;br&gt;&#xA;are used for icons in the bottom toolbar. file &amp;quot;0&amp;quot; to replace the left arrow button, &amp;quot;1&amp;quot; for right arrow button, &amp;quot;2&amp;quot; for the setting button,&amp;quot;3&amp;quot; for the home screen button,...&lt;/p&gt;&#xA;&lt;p&gt;If a new button is defined (file name &amp;quot;20&amp;quot; exists), uweb also supports VectorDrawable with &amp;quot;android compiled XML&amp;quot; format. All icon files must be either all compiled VectorDrawables or common image formats.&lt;/p&gt;</description>
<description>If subfolder &amp;quot;icon&amp;quot; exists, then files named as &amp;quot;0&amp;quot;,&amp;quot;1&amp;quot;,&amp;quot;2&amp;quot;...
are used for icons in the bottom toolbar. file &amp;quot;0&amp;quot; to replace the left arrow button, &amp;quot;1&amp;quot; for right arrow button, &amp;quot;2&amp;quot; for the setting button,&amp;quot;3&amp;quot; for the home screen button,...
If a new button is defined (file name &amp;quot;20&amp;quot; exists), uweb also supports VectorDrawable with &amp;quot;android compiled XML&amp;quot; format. All icon files must be all VectorDrawables or 此时所有图标文件必须都是compiled XML格式或都是普通的图像格式png,jpg,gif等。用户可将VectorDrawable XML文件放到安卓项目目录assets下面重新生成apk文件以后将apk文件解压即可得compiled XML格式图标文件。</description>
</item> </item>
<item> <item>
<title>Long pressed link menu</title> <title>Search engine files</title>
<link>/en/longclick/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/searchcat/</link>
<pubDate>Fri, 06 Nov 2020 00:00:00 +0000</pubDate> <pubDate>Mon, 10 Jan 2022 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/searchcat/</guid>
<guid>/en/longclick/</guid> <description>&lt;p&gt;Search engine file names have &amp;quot;.search&amp;quot; as postfix. When they are clicked, the associated bookmark files with postfix &amp;quot;.search.html&amp;quot; would be appended. Ex: the associated bookmark for &amp;quot;foo.search&amp;quot; is &amp;quot;foo.search.html&amp;quot;.&lt;/p&gt;&#xA;&lt;p&gt;Any &amp;quot;.search&amp;quot; file can be opened as search engine file, each line of which has one of the following formats:&lt;br&gt;&#xA;[Engine name]:[url without &#39;%s&#39; inside]&lt;br&gt;&#xA;[Engine name]:[url with &#39;%s&#39; as keyword]&lt;br&gt;&#xA;[Engine name]:POST:[post params with &#39;%s&#39; as keyword]:[url]&lt;br&gt;&#xA;[Engine name]:[Extra request headers]:[post params with &#39;%s&#39; as keyword]:[url]&lt;/p&gt;</description>
<description>To run commands Each line of file &amp;quot;default.longclick&amp;quot; has the following format: (same as default.cmds) </item>
[Name]:[mimetype]:[command line] <item>
in which [command line] can have &amp;quot;%c&amp;quot; (cookie), &amp;quot;%u&amp;quot; (current url), &amp;quot;%t&amp;quot; (title) etc. <title>Termux</title>
To visit url and load javascript file All &amp;quot;.js&amp;quot; files under the folder &amp;quot;longclick&amp;quot; are part of the popup menu. <link>https://jamesfengcao.gitlab.io/uweb/en/termux/</link>
These javascript files are in the following format: <pubDate>Sat, 01 Jan 2022 00:00:00 +0000</pubDate>
The very first line can begin with &amp;quot;//&amp;quot; followed by website url that can have &amp;quot;%u&amp;quot; (current url), &amp;quot;%t&amp;quot; (title) etc.</description> <guid>https://jamesfengcao.gitlab.io/uweb/en/termux/</guid>
<description>&lt;p&gt;Only the termux versions provided along with uweb browser can work seamlessly. For android 10+, please install termux before installing uweb browser. If uweb is already installed, users can uninstall it first, then install termux and reinstall uweb browser.&lt;/p&gt;&#xA;&lt;h4 id=&#34;termux-bookmarks&#34;&gt;Termux bookmarks&lt;/h4&gt;&#xA;&lt;p&gt;Long pressing the following links then either &amp;quot;commands&amp;quot;-&amp;gt;&amp;quot;&lt;a href=&#34;../urls/index.html#&#34;&gt;bookmark&lt;/a&gt;&amp;quot; to add bookmarks or &amp;quot;open in new tab&amp;quot; to execute.&lt;br&gt;&#xA;&lt;a href=&#34;c:bc -l&#34;&gt;GNU bc (basic calculator)&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;c:bc -l *.bc&#34;&gt;bc with all extensions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;click-the-following-links-to-install-termux-configurations&#34;&gt;Click the following links to install termux configurations:&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0h/data/data/com.termux/files/home/.bashrc:../../termux/bashrc&#34;&gt;.bashrc&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
<title>User agents</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/useragents/</link>
<pubDate>Sat, 01 Jan 2022 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/useragents/</guid>
<description>&lt;p&gt;Clicking the following links to add user agents with &lt;a href=&#34;../index.html#&#34;&gt;uweb browser&lt;/a&gt; or &lt;a href=&#34;../ebrowserreadme/index.html#&#34;&gt;ebrowser&lt;/a&gt;.&lt;br&gt;&#xA;&lt;a href=&#34;i:02EdgA:Mozilla/5.0 (Linux; Android 13; KB2000) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36 EdgA/127.0.2610.80&#34;&gt;Edge for android&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;i:02Edge:Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36 Edg/127.0.2610.80&#34;&gt;Edge for windows&lt;/a&gt;&lt;/p&gt;</description>
</item>
<item>
<title>Tools</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/tools/</link>
<pubDate>Sun, 06 Sep 2020 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/tools/</guid>
<description>&lt;p&gt;This page is for &lt;a href=&#34;../index.html#&#34;&gt;uweb browser&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;install-tdict_local-search-with-local-indexes-and-remote-content&#34;&gt;&lt;a href=&#34;i:0bhttps://fastly.jsdelivr.net/gh/torappinfo/uwebjs/bin/tdict_loc.tar.gz&#34;&gt;install tdict_local (search with local indexes and remote content)&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;Click to install the following local indexes with corresponding search engines (for test only).&lt;br&gt;&#xA;&lt;a href=&#34;i:0hahd.tidx:https://fastly.jsdelivr.net/gh/torappinfo/uwebjs/bin/ahd.tidx&#34;&gt;install the indexes for &amp;quot;American heritage dictionary (en-en&amp;amp;zh with AHD/D.J./K.K. pronunciation)&amp;quot;&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;i:00AHD:d:text/html:tdict_loc ahd \&#39;%s\&#39;|loc2html text/plain \&#39;https://s1.asytech.cn/s/HxY9QT5cdp63ZPK/download?path=%2F&amp;files=ahd.dict\&#39;:&#34;&gt;Install AHD to home screen&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0henja.tidx:https://fastly.jsdelivr.net/gh/torappinfo/uwebjs/bin/enja.tidx&#34;&gt;Indexes for &amp;quot;研究社新編英和活用大辞典(English usage: en-en&amp;amp;ja)&amp;quot;&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;i:00enja:d:text/html:tdict_loc enja \&#39;%s\&#39;|loc2html text/plain \&#39;https://s1.asytech.cn/s/oaoGniEBKLnWzoj/download?path=%2F&amp;files=enja.dict\&#39;:&#34;&gt;Install &amp;quot;English usage (en-en&amp;amp;ja)&amp;quot;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0hsoed.tidx:https://fastly.jsdelivr.net/gh/torappinfo/uwebjs/bin/soed.tidx&#34;&gt;Indexes for SOED6&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;i:00soed:d:text/html:tdict_loc soed \&#39;%s\&#39;|loc2html text/plain \&#39;https://s1.asytech.cn/s/oaoGniEBKLnWzoj/download?path=%2F&amp;files=soed.dict\&#39;:&#34;&gt;install SOED&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The following dictionaries work better with markdown processor.&lt;br&gt;&#xA;&lt;a href=&#34;i:0hmd.html:https://fastly.jsdelivr.net/gh/torappinfo/uwebjs/txt/mdme.html&#34;&gt;Install markdown processor&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;i:0hmwi.tidx:https://fastly.jsdelivr.net/gh/torappinfo/uwebjs/bin/mwi.tidx&#34;&gt;Indexes for &amp;quot;Merriam Webster International Unabridged&amp;quot;&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;i:00mwi:d:text/html:tdict_loc mwi \&#39;%s\&#39;|loc2html text/html.md.html \&#39;https://s1.asytech.cn/s/oaoGniEBKLnWzoj/download?path=%2F&amp;files=mwi.dict\&#39;:&#34;&gt;Install MWI&lt;/a&gt;&lt;/p&gt;</description>
</item> </item>
<item> <item>
<title>Custom file handling</title> <title>Custom file handling</title>
<link>/en/filecap/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/filecap/</link>
<pubDate>Mon, 24 Aug 2020 00:00:00 +0000</pubDate> <pubDate>Mon, 24 Aug 2020 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/filecap/</guid>
<guid>/en/filecap/</guid> <description>&lt;p&gt;Long press the settings button, check the option &amp;quot;custom file handling&amp;quot; to enable the functionality.&lt;/p&gt;&#xA;&lt;p&gt;The custom file handling configuration file is &amp;quot;default.filecap&amp;quot;, each line of it has the format as follows:&lt;br&gt;&#xA;[file extension]:[mimetype]:[command line]&lt;/p&gt;&#xA;&lt;p&gt;The &amp;quot;[file extension]&amp;quot; part can have at most two-segment of extensions such as &amp;quot;txt.xz&amp;quot;,&amp;quot;html.gz&amp;quot;.&lt;br&gt;&#xA;&amp;quot;[mimetype]&amp;quot; indicates the type of &amp;quot;[command line]&amp;quot; output.&lt;br&gt;&#xA;&amp;quot;[command line]&amp;quot; is same as the one in &lt;a href=&#34;../cmds/index.html#&#34;&gt;default.cmds&lt;/a&gt;. The most often used replacements are:&lt;br&gt;&#xA;%u (url), %U (urlencoded url), %c (cookie), %p (site password, curl format).&lt;/p&gt;</description>
<description>Long press the settings button, check the option &amp;quot;custom file handling&amp;quot; to enable the functionality.
The custom file handling configuration file is &amp;quot;default.filecap&amp;quot;, each line of it has the format as follows:
[file extension]:[mimetype]:[command line]
The &amp;quot;[file extension]&amp;quot; part can have at most two-segment of extensions such as &amp;quot;txt.xz&amp;quot;,&amp;quot;html.gz&amp;quot;.
&amp;quot;[mimetype]&amp;quot; indicates the type of &amp;quot;[command line]&amp;quot; output.
&amp;quot;[command line]&amp;quot; is same as the one in default.cmds. The most often used replacements are:</description>
</item> </item>
<item> <item>
<title>Blocking domain trees</title> <title>Gestures</title>
<link>/en/adblock_domain/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/gesture/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate> <pubDate>Thu, 18 Jun 2020 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/gesture/</guid>
<guid>/en/adblock_domain/</guid> <description>&lt;p&gt;Swipe down from the top to show the address bar; swipe up to the top to hide the address bar. Swipe down to the bottom to hide the toolbar with option &amp;quot;swipe to hide tools&amp;quot;; swipe on the bottom corners to show the toolbar.&lt;/p&gt;&#xA;&lt;p&gt;Swipe left/right near the toolbar to switch window; fling left/right to switch to the last/first window.&lt;/p&gt;&#xA;&lt;p&gt;Swiping on the top part of content window (near the top address bar by default) triggers corresponding link in the file &amp;quot;default.gesture&amp;quot;, which has the same format as &lt;a href=&#34;../links/index.html#&#34;&gt;default.link&lt;/a&gt;.&lt;/p&gt;</description>
<description>hosts blocks whole domain trees including all descedant domains. The domains in the hosts file must be 2 or 3 segment domains, such as &amp;quot;yahoo.com&amp;quot; and &amp;quot;finance.yahoo.com&amp;quot;. If the length of the last 2 segments is less than 7, such as &amp;quot;com.pl&amp;quot;, then it is treated as one segment, so domains like &amp;quot;xxx.xxx.com.pl&amp;quot; are also valid in the hosts file.
Each line of the hosts file has the following format:</description>
</item> </item>
<item>
<title>Change log</title>
<link>/en/changelog/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>/en/changelog/</guid>
<description>901: Use in-app files folder for configuration</description>
</item>
<item>
<title>Javascript and CSS for domains</title>
<link>/en/sitejs/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>/en/sitejs/</guid>
<description>Javascript (load when page completes, earliest loaded JS should use sitecss).
Need to be named as &amp;quot;[domain root].js&amp;quot;, such as &amp;quot;yahoo.com.js&amp;quot; or &amp;quot;finance.yahoo.com.js&amp;quot;. The script will be loaded on the whole domain tree sites. If several files matches the domain, then the script with longest file name is loaded. Script must be put under the folder &amp;quot;sitejs&amp;quot; or &amp;quot;/data/data/info.torapp.uweb/files/sitejs&amp;quot;. The later folder has the priority. Long press the button &amp;quot;settings&amp;quot;, check the option &amp;quot;Run user scripts&amp;quot;.</description>
</item>
</channel> </channel>
</rss> </rss>

98
en/acmd/index.html Normal file
View file

@ -0,0 +1,98 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/acmd/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Address bar command line</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Address bar command line
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<h3 id="--or--command-line">&quot;:!&quot; ( or &quot;!&quot;) command line</h3>
<p>Pressing &quot;:&quot; or &quot;!&quot; with hardware keyboard sets focus on the address bar.<br>
The command line could be a &quot;.js&quot;, &quot;.sh&quot; or other executable with arguments. Ex. &quot;:!s g keyword&quot; could invoke &quot;s.js&quot; executable with the whole string as arguments (&quot;s.sh&quot; or &quot;s&quot; if file exists, here &quot;g&quot; as google search engine); &quot;:! g keyword&quot; would invoke the file &quot;.js&quot; or &quot;.sh&quot; as executable.</p>
<p>For regular (non-js) executables, the standard output of the command line could be treated as lines of urls (or html, plain text).</p>
<p><a href="i:0h.js:../searchurl/txt/web.js">Install the example file &quot;.js&quot; (supporting search engine bundle)</a><br>
<a href="i:0hs.sh:../searchurl/txt/web.sh">Install the example file &quot;s.sh&quot;</a></p>
<p>Click the following links to make commands appear in address bar, then press &quot;enter&quot; to execute:<br>
<a href="i:15:!cd /data/data/com.termux/files/home;ln -s ../../../info.torapp.uweb/files uweb">Make uweb configuration folder accessible by file managers with termux installed</a><br>
(<a href="https://wiki.termux.com/wiki/Internal_and_external_storage">File manager list at end of the page</a>)</p>
<h3 id="address-bar-command-modes">Address bar command modes</h3>
<p><a href="../cmds/index.html#">Commands</a> are the best for repeated execution of an instruction. Address bar command modes provide ways to run different commands in the same category easily.</p>
<p>The configure file &quot;default.acmd&quot; has the exactly same format as <a href="../cmds/index.html#">default.cmds</a>. Click the following links to install new modes (cold start the app to take effect, then long click the &quot;refresh&quot; button to switch modes):</p>
<p><a href="i:0gdefault.acmd::shell:text/plain:%25s%0A">Shell command mode</a></p>
<p><a href="i:0gdefault.acmd::bc:text/plain:echo '%25s'|bc -l -q%0A">GNU bc (basic calculator) command mode (need termux for Android 10- )</a></p>
<p><a href="i:0gdefault.acmd::plot 2D function:image/svg%2Bxml:gnuplot -e 'set term svg;set
output;plot %25s'%0A">GNUPlot plot (2D function), needs uweb adapted termux &amp; gnuplot</a></p>
<p><a href="i:0gdefault.acmd::plot 3D function:image/svg%2Bxml:gnuplot -e 'set term svg;set
output;splot %25s'%0A">GNUPlot plot (3D function), needs uweb adapted termux &amp; gnuplot</a></p>
</div>
<p>Last Modified: 2 April 2024<br>
add js function in README<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

View file

@ -3,10 +3,11 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/adblock/" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>AD blocking</title> <title>AD blocking</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +29,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a> <a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
@ -49,13 +50,13 @@
</ul> </ul>
<ul> <ul>
<li> <li>
<p><a href="../adblock_domain/index.html">Host blocking</a></p> <p><a href="../adblock_domain/index.html#">Host blocking</a></p>
<ul> <ul>
<li>Use <a href="../bookmarklet/index.html">bookmarklet &quot;list all script urls&quot;</a> to generate url links, long pressing dubious script (usually 3rd-party library) link, click &quot;Block domain root&quot;.</li> <li>Use <a href="../bookmarklet/index.html#">bookmarklet &quot;list all script urls&quot;</a> to generate url links, long pressing dubious script (usually 3rd-party library) link, click &quot;Block domain root&quot;.</li>
</ul> </ul>
</li> </li>
<li> <li>
<p><a href="../sitejs/index.html">Javascript and CSS for domains</a></p> <p><a href="../sitejs/index.html#">Javascript and CSS for domains</a></p>
<ul> <ul>
<li>Long press the button &quot;js&quot;, click the menu &quot;MarkAD mode&quot;. In &quot;markAD mode&quot;, click page element to show all attributes and generate CSS AD blocking styles. By default, &quot;display:none&quot; is used. If &quot;display&quot; appears in the attribute information, recommend to use &quot;transform:scale(0)!important&quot; instead.</li> <li>Long press the button &quot;js&quot;, click the menu &quot;MarkAD mode&quot;. In &quot;markAD mode&quot;, click page element to show all attributes and generate CSS AD blocking styles. By default, &quot;display:none&quot; is used. If &quot;display&quot; appears in the attribute information, recommend to use &quot;transform:scale(0)!important&quot; instead.</li>
</ul> </ul>
@ -68,7 +69,7 @@
</ul> </ul>
</li> </li>
<li> <li>
<p>Long press the setting button, check the option &quot;Block external scripts&quot;. <a href="i:61:https://fastly.jsdelivr.net/gh/torappinfo/uwebzh/en/searchurl/func.html">UI</a> website has option to also block dubious 3rd party resources. <a href="file:///data/data/info.torinfo.uweb/files/js.allow">js.allow</a> whitelists js libraries.</p> <p>Long press the setting button, check the option &quot;Block external scripts&quot;. <a href="i:61:../searchurl/func.html">UI</a> website has option to also block dubious 3rd party resources. <a href="file:///data/data/info.torapp.uweb/files/js.allow">js.allow</a> whitelists js libraries.</p>
</li> </li>
<li> <li>
<p>Long press the button [☰], &quot;Disable floating ADs&quot;, &quot;Disable banners&quot;, &quot;clear all timers&quot;, &quot;stop events&quot; and &quot;Sleep ...&quot; are also available.</p> <p>Long press the button [☰], &quot;Disable floating ADs&quot;, &quot;Disable banners&quot;, &quot;clear all timers&quot;, &quot;stop events&quot; and &quot;Sleep ...&quot; are also available.</p>
@ -80,11 +81,40 @@
<p>Click the button &quot;JS&quot; to disable javascript.</p> <p>Click the button &quot;JS&quot; to disable javascript.</p>
</li> </li>
<li> <li>
<p><a href="file:///data/data/info.torinfo.uweb/files/url.deny">url.deny</a>: one giant regular expression for blocked urls (java grammar), in which carriage returns (CR or newline) are ignored and &quot;#&quot; is for comments.</p> <p><a href="file:///data/data/info.torapp.uweb/files/url.deny">url.deny</a>: one giant regular expression for blocked urls (java grammar), in which carriage returns (CR or newline) are ignored and &quot;#&quot; is for comments.</p>
</li> </li>
</ul> </ul>
</div> </div>
<p>Last Modified: 2 April 2024<br>
add js function in README<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

View file

@ -3,10 +3,11 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/adblock_domain/" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Blocking domain trees</title> <title>Hosts files</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +29,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a> <a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
@ -40,21 +41,86 @@
<br /> <br />
<div class="container"> <div class="container">
<h1 class="title">Blocking domain trees <h1 class="title">Hosts files
<br> <br>
<span class="subtitle"></span> <span class="subtitle"></span>
</h1> </h1>
<ul class="tags"> <ul class="tags">
<li><a href="../tags/adblock">adblock</a> </li> <li><a href="../tags/adblock/index.html#">adblock</a> </li>
</ul> </ul>
<p><a href="file:///data/data/info.torinfo.uweb/files/default.hosts">hosts</a> blocks whole domain trees including all descedant domains. The domains in the hosts file must be 2 or 3 segment domains, such as &quot;yahoo.com&quot; and &quot;finance.yahoo.com&quot;. If the length of the last 2 segments is less than 7, such as &quot;com.pl&quot;, then it is treated as one segment, so domains like &quot;xxx.xxx.com.pl&quot; are also valid in the hosts file.</p> <p>The enhanced hosts files &quot;hosts&quot; and &quot;default.hosts&quot; take effect with the setting option &quot;use hosts&quot;.</p>
<h4 id="hosts">hosts</h4>
<p>The <span style="color:red">enhanced</span> file <a href="file:///data/data/info.torapp.uweb/files/hosts">&quot;hosts&quot;</a> defines IP addresses/attributes for domains. Each line has the following format:<br>
[[IP address][attributes]][single space][domain name]</p>
<p>where &quot;[[IP address][attributes]]&quot; could be:</p>
<ul>
<li>
<p>ipv4 address such as:<br>
172.67.157.211 torapp.eu.org</p>
</li>
<li>
<p>ipv6 address, Ex.:<br>
[2606:4700:3037::6815:8c3] torapp.eu.org</p>
</li>
<li>
<p>empty, that would lift all server-imposed limitations. Ex.:<br>
[single space]gitee.com</p>
<p>which will make all git repositories on the domain visitable as websites with raw file access url.</p>
</li>
<li>
<p>response headers, separeded by ';', Ex.:<br>
Access-Control-Allow-Origin;https://www.bing.com;Access-Control-Allow-Credentials;true mybing.xn--xyza.top</p>
<p>which makes &quot;mybing2.xn--xyza.top&quot; to accept CORS requests with cookies.</p>
</li>
<li>
<p>IP address and response headers, separeded by ';', Ex.:<br>
104.21.8.195;Access-Control-Allow-Origin;https://www.bing.com;Access-Control-Allow-Credentials;true uweb.torapp.eu.org</p>
</li>
<li>
<p>IP address, real domain name and response headers (Experimental), separeded by ';', Ex.:<br>
104.21.8.195;www.bing.com uweb.torapp.eu.org</p>
<p>which indicates the domain &quot;uweb.torapp.eu.org&quot; is just a proxy of &quot;www.bing.com&quot;, and as such, the cookies of &quot;www.bing.com&quot; would be used for &quot;uweb.torapp.eu.org&quot;.</p>
<p>To make life easier, use lower-case domain name (the first letter should not be a digital) and capitalize the first letter of response header names.</p>
</li>
</ul>
<h4 id="defaulthosts">default.hosts</h4>
<p><a href="file:///data/data/info.torapp.uweb/files/default.hosts">&quot;default.hosts&quot;</a> blocks whole domain trees including all descendant domains. The domains in the hosts file must be 2 or 3 segment domains, such as &quot;yahoo.com&quot; and &quot;finance.yahoo.com&quot;. If the length of the last 2 segments is less than 7, such as &quot;com.pl&quot;, then it is treated as one segment, so domains like &quot;xxx.xxx.com.pl&quot; are also valid in the hosts file.</p>
<p>Each line of the hosts file has the following format:<br> <p>Each line of the hosts file has the following format:<br>
[rootDomain][space][regex for domain prefix before rootDomain][space][regex for the whole url without &quot;http(s)://&quot;]<br> [rootDomain][space][regex for domain prefix before rootDomain][space][regex for the whole url without &quot;http(s)://&quot;]<br>
The first part [rootDomain] is required and the others are optional. regex is java-grammar regular expression. If the second regex is used, it is recommended to merge the first regex to the second one for performance.</p> The first part [rootDomain] is required and the others are optional. regex is java-grammar regular expression. If the second regex is used, it is recommended to merge the first regex to the second one for performance.</p>
</div> </div>
<p>Last Modified: 2 April 2024<br>
update bingAI/js/optionsSets.js<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

124
en/bookmark/index.html Normal file
View file

@ -0,0 +1,124 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/bookmark/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Bookmarks</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Bookmarks
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<p>AI, chatgpt etc.</p>
<ul>
<li><a href="https://aistudio.google.com/app/prompts/new_chat">google</a></li>
<li><a href="https://gemini.google.com/app">google gemini</a></li>
<li><a href="https://jeeves.ai/chat">jeeves</a></li>
<li><a href="https://poe.com">poe</a></li>
<li><a href="https://www.teach-anything.com/">teach-anything</a></li>
<li><a href="https://magickpen.com/">magickpen</a></li>
</ul>
<p>Scholar:</p>
<ul>
<li><a href="https://lumina.sh">Lumina</a></li>
</ul>
<p><a href="https://note.ms">note.ms</a><br>
<a href="https://rentry.org">rentry</a><br>
<a href="i:1w">Wait for url from other devices</a><br>
<a href="https://berify.com">berify: reverse image search for video</a></p>
<h3 id="associated-bookmarks">Associated bookmarks</h3>
<p><a href="../searchcat/index.html#">Search engine files</a> associate with bookmarks with extension &quot;.html&quot;, which means the bookmark file if existing is appended to the page when the search engine file is on screen.</p>
<p>&quot;help_en.html&quot; bookmark associates with the user manual in English. Similarly, &quot;help_zh.html&quot; is for Chinese manual. Whenever user manual is open, the associated bookmark appears before the manual.</p>
<h3 id="tips">Tips</h3>
<h4 id="file-handling-and-styling-with-homecss">File handling and styling with home.css</h4>
<p>&quot;home.css&quot; (in current folder, parent folder or the &quot;bookmark&quot; folder) styles bookmarks, search engines and the folder itself. The file is in html format instead of CSS, so it needs &quot;&lt;style&gt;&quot; tag for CSS.</p>
<p><a href="i:0hbookmark/home.css:../searchurl/txt/markdeep.html">Install markdeep styling for markdown files</a></p>
<h3 id="bookmarks-with-secrets-post-instead-of-get">Bookmarks with secrets (POST instead of GET)</h3>
<p>The <a href="../links/index.html#">internal link</a> &quot;i:a1[url]?[post data]&quot; sends http &quot;POST&quot; request to server.</p>
<h3 id="commands">Commands</h3>
<p>Clicking to run is only allowed from local pages for bookmarks in this section. Users need to either save the bookmarks to local or long press the link =&gt; &quot;open in new tab&quot; to execute.</p>
<p>To save the bookmarks to local, users firstly need to install &quot;bookmark&quot; menu by clicking corresponding link in the <a href="../urls/index.html#">url services</a> page, then long press the bookmark link =&gt; &quot;open in new tab&quot; =&gt; &quot;Commands&quot; =&gt; &quot;bookmark&quot; to save the bookmark.</p>
<p><a href="d::mkdir -p /sdcard/Download/uweb;cd /data/data/info.torapp.uweb;cp -r files /sdcard/Download/uweb;rm -rf files;ln -s /sdcard/Download/uweb files:">symbolic link configuration folder to &quot;/sdcard/Download/uweb&quot;</a></p>
<p><a href="d::cd /data/data/com.termux/files/home;ln -s ../../../info.torapp.uweb/files uweb:">Make uweb configuration folder accessible by file managers with termux installed</a><br>
(<a href="i:16::com.android.documentsui:">documentsUI</a> or <a href="https://wiki.termux.com/wiki/Internal_and_external_storage">File manager list at end of the page</a>)</p>
<p><a href="d::cd /sdcard/Download/mdict;for i in *.mdx; do b=`basename ${i} .mdx`;fs=%22${i}%22;if [ -f ${b}.mdd ];then fs=${fs}%22,${b}.mdd%22;fi;echo ${b}:i:5ifile:///sdcard/Download/mdict/${fs}?app=https://cdn.jsdelivr.net/gh/torappinfo/uweb/en/searchurl/mdict/mdict.html#word=%25s >>/data/data/info.torapp.uweb/files/home5.search;done:">Scan mdx/mdd files under the folder &quot;/sdcard/Download/mdict&quot; and add search engines</a>.</p>
<h4 id="termux">Termux</h4>
<p>The following bookmarks need termux.<br>
<a href="c:bc -l">GNU bc (basic calculator)</a><br>
<a href="c:bc -l *.bc">bc with all extensions</a></p>
<h3 id="templates">Templates</h3>
<p>Click following links to install bookmark templates, bookmarks saved to the template have corresponding features enabled.<br>
<a href="i:0hbookmark/novel.html:../../zh/searchurl/bookmark/novel.html">&quot;novel.html&quot;: auto reader's mode</a></p>
</div>
<p>Last Modified: 26 January 2025<br>
update AI engines<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

View file

@ -3,10 +3,11 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/bookmarklet/" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Bookmarklets</title> <title>Bookmarklets</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +29,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a> <a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
@ -46,10 +47,10 @@
</h1> </h1>
<ul class="tags"> <ul class="tags">
<li><a href="../tags/javascript">javascript</a> </li> <li><a href="../tags/javascript/index.html#">javascript</a> </li>
</ul> </ul>
<p>With a href=&quot;../index.html&quot;&gt;uweb browser</a>, long pressing any bookmarklet link, click &quot;Open in new tab&quot;, the bookmarklet will be run on the last other tab.</p> <p>With <a href="../index.html#">uweb browser</a>, long pressing any bookmarklet link, click &quot;Open in new tab&quot;, the bookmarklet will be run on the last other tab.</p>
<p><a href="javascript:{let es=document.getElementsByTagName('script');let urls='';for(let i=0;i<es.length;i++){if(es[i].src)urls+=es[i].src+'<br>';}let w=window.open(''),s=w.document;s.write(urls);s.close();w.location.href='i:631:';}">List all script urls</a></p> <p><a href="javascript:{let es=document.getElementsByTagName('script');let urls='';for(let i=0;i<es.length;i++){if(es[i].src)urls+=es[i].src+'<br>';}let w=window.open(''),s=w.document;s.write(urls);s.close();w.location.href='i:631:';}">List all script urls</a></p>
<p><a target="_self" href="javascript:alert(navigator.userAgent)">User agent</a><br> <p><a target="_self" href="javascript:alert(navigator.userAgent)">User agent</a><br>
<a href="javascript:(function(){var w=window.open(''),s=w.document;s.write('<html><body></body></html>');s.close();var pre=s.body.appendChild(s.createElement('pre'));pre.style.overflow='auto';pre.style.whiteSpace='pre-wrap';pre.appendChild(s.createTextNode(document.cookie))})()">Cookie</a><br> <a href="javascript:(function(){var w=window.open(''),s=w.document;s.write('<html><body></body></html>');s.close();var pre=s.body.appendChild(s.createElement('pre'));pre.style.overflow='auto';pre.style.whiteSpace='pre-wrap';pre.appendChild(s.createTextNode(document.cookie))})()">Cookie</a><br>
@ -71,6 +72,35 @@
<p><a href="javascript: (function() { var url = ('http://www.bugmenot.com/view/' + escape(location.hostname)); w = open(url, 'w', 'location=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width=500,height=400,modal=yes,dependent=yes'); if (w) { setTimeout('w.focus()', 1000) } else { location = url } })();">BugMeNot</a></p> <p><a href="javascript: (function() { var url = ('http://www.bugmenot.com/view/' + escape(location.hostname)); w = open(url, 'w', 'location=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width=500,height=400,modal=yes,dependent=yes'); if (w) { setTimeout('w.focus()', 1000) } else { location = url } })();">BugMeNot</a></p>
</div> </div>
<p>Last Modified: 11 June 2024<br>
fix typos<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

View file

@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel> <channel>
<title>Categories on </title> <title>Categories on uweb browser: unlimited power</title>
<link>/en/categories/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/categories/</link>
<description>Recent content in Categories on </description> <description>Recent content in Categories on uweb browser: unlimited power</description>
<generator>Hugo -- gohugo.io</generator><atom:link href="/en/categories/index.xml" rel="self" type="application/rss+xml" /> <generator>Hugo</generator>
<language>en</language>
<atom:link href="https://jamesfengcao.gitlab.io/uweb/en/categories/index.xml" rel="self" type="application/rss+xml" />
</channel> </channel>
</rss> </rss>

View file

@ -3,10 +3,11 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/changelog/" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Change log</title> <title>Downloads</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +29,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<nav> <nav>
</nav> </nav>
@ -36,16 +37,68 @@
<br /> <br />
<div class="container"> <div class="container">
<h1 class="title">Change log <h1 class="title">Downloads
<br> <br>
<span class="subtitle"></span> <span class="subtitle"></span>
</h1> </h1>
<ul class="tags"> <ul class="tags">
</ul> </ul>
<p>901: Use in-app files folder for configuration</p> <p><a href="https://www.amazon.com/TorApp-Info-uweb-browser-for-geeks/dp/B098QPR6N5">Amazon appstore</a></p>
<p><a href="https://galaxystore.samsung.com/detail/info.torapp.uweb">Galaxy.Store</a></p>
<p><a href="https://github.com/torappinfo/uweb/releases/tag/v1">github</a></p>
<p><a href="https://sourceforge.net/projects/uwebbrowser/files/v1/">sourceforge</a></p>
<p><a href="https://uweb-browser-for-geeks.en.uptodown.com/android" title="uweb"><img src="https://stc.utdstc.com/img/mediakit/download-gio-big.png" alt=""></a></p>
<p><a href="https://my.powerfolder.com/getlink/fi61cC6VHjK72tfufmnLAz/">powerfolder</a></p>
<p><a href="https://codeberg.org/jamesfengcao/pages/releases">codeberg</a></p>
<p><a href="https://uno.teracloud.jp/share/1162dfa8376e1609">infinicloud</a></p>
<p><a href="https://gitee.com/jamesfengcao/uweb/releases">gitee</a></p>
<p><a href="https://gitea.com/torappinfo/uweb/releases">gitea</a></p>
<p><a href="https://gitdab.com/jamesfengcao/uweb/releases">gitdab</a></p>
<p><a href="https://gitnet.fr/jamesfengcao/uweb/releases">gitnet</a></p>
<p><a href="https://tildegit.org/jamesfengcao/uweb/releases">tildegit</a></p>
<p><a href="https://notabug.org/torappinfo/uweb/releases">NotABug</a></p>
<p><a href="https://releases.pagure.org/uwebapk/">pagure</a></p>
<p><a href="https://pan.baidu.com/s/17coQj6DCHqghMMNJUyjgrA#list/path=%2Fuweb">baidu</a></p>
<p><a href="https://pan.lanzouu.com/b0qpxnob">蓝奏</a></p>
<h4 id="main-features"><a href="../readme/index.html">Main features</a></h4>
<h4 id="change-logs"><a id="log">Change logs<a></h4>
<p>1146: remote/local big txt/html file (optional .zst,.gz,.br compressed) as search engines<br>
1144: novel reader support for remote large text/html files (could be .gz, .br, .zst compressed)<br>
enhance url services to support %u, %t<br>
1139: support \n as newline in default.input &amp; default.autoc<br>
1104: support command context submenus (image.link, download.link &amp; context.link).</p>
</div> </div>
<p>Last Modified: 6 January 2026<br>
html5: paged reader/engine support<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

153
en/cmds/index.html Normal file
View file

@ -0,0 +1,153 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/cmds/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Commands</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Commands
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<p>Click the following links to install commands with <a href="../index.html#">uweb browser</a>. <b>Force exit and re-launch the app</b>, then long press the button with clock icon to popup the command menu.</p>
<p>Configuration file &quot;default.cmds&quot; examples:</p>
<p><a href="i:03Quit & clear data:q:toybox find /data/data/info.torapp.uweb/app_webview ! -name 'Cookies' ! -name '*.cjar' -type f -delete">Quit &amp; clear data:q:toybox find /data/data/info.torapp.uweb/app_webview ! -name 'Cookies' ! -name '*.cjar' -type f -delete</a></p>
<p><a href="i:03Clipboard2input:clip:cat>>default.input">Clipboard2input:clip:cat&gt;&gt;default.input</a></p>
<p><a href="i:03Clear database::rm -rf /data/data/info.torapp.uweb/databases/*">Clear database::rm -rf /data/data/info.torapp.uweb/databases/*</a></p>
<p><a href="i:03Append query to autocomplete:uweb:cd /data/data/info.torapp.uweb/files;cat default.autoc query.log|toybox sort|toybox uniq -i>a.tmp;mv a.tmp default.autoc;>query.log;echo file:///data/data/info.torapp.uweb/files/default.autoc">Append query to autocomplete:uweb:cd /data/data/info.torapp.uweb/files;cat default.autoc query.log|toybox sort|toybox uniq -i&gt;a.tmp;mv a.tmp default.autoc;&gt;query.log;echo file:///data/data/info.torapp.uweb/files/default.autoc</a></p>
<p><a href="i:03Clear cache::toybox rm -rf /data/data/info.torapp.uweb/cache">Clear cache::toybox rm -rf /data/data/info.torapp.uweb/cache</a></p>
<p><a href="i:03Clear logcat::logcat -c">Clear logcat::logcat -c</a></p>
<p><a href="i:03logcat.log::logcat -d > logcat.log">logcat.log::logcat -d &gt; logcat.log</a></p>
<p><a href="i:03copy cookie:/clip:printf '%c'">copy cookie:/clip:printf '%c'</a></p>
<p><a href="i:03config in Download::cd /data/data/info.torapp.uweb;toybox rm -rf files;toybox mkdir -p /sdcard/Download/uweb;toybox ln -s /sdcard/Download/uweb files">config in Download::cd /data/data/info.torapp.uweb;toybox rm -rf files;toybox mkdir -p /sdcard/Download/uweb;toybox ln -s /sdcard/Download/uweb files</a></p>
<p><a href="i:03html5 in Download::cd /data/data/info.torapp.uweb/files;toybox rm -rf app;toybox mkdir -p /sdcard/Download/app;toybox ln -s /sdcard/Download/app">html5 in Download::cd /data/data/info.torapp.uweb/files;toybox rm -rf app;toybox mkdir -p /sdcard/Download/app;toybox ln -s /sdcard/Download/app</a></p>
<p><a href="i:03tgz install::cd /;toybox tar -xzf %f">tgz install::cd /;toybox tar -xzf %f</a></p>
<p>Users should change the IP addresses in the following menus accordingly. In all cases, TV side needs to execute &quot;<a href="../links/index.html#">wait for network msg</a>&quot; first. Send message to network (ex. for android TVs):<br>
<a href="i:03clip2PC:clip:cat|/system/bin/toybox nc 192.168.1.120 1500">clip2PC:clip:cat|/system/bin/toybox nc 192.168.1.120 1500</a></p>
<p><a href="i:03PC2clip:/clip:/system/bin/toybox nc 192.168.1.120 1500">PC2clip:/clip:/system/bin/toybox nc 192.168.1.120 1500</a></p>
<p><a href="i:03Send clipboard:clip/uweb:printf 'i:5ji:5b';cat">Send clipboard:clip/uweb:printf 'i:5ji:5b';cat</a></p>
<p><a href="i:03Send url::printf '%u'|/system/bin/toybox nc 192.168.2.155 1500">Send url::printf '%u'|/system/bin/toybox nc 192.168.2.155 1500</a></p>
<p><a href="i:03Sendurl(bookmark)::printf 'i:51../home5:i:0mc16:%u'|/system/bin/toybox nc 192.168.2.155 1500">Sendurl(bookmark)::printf 'i:51../home5:i:0mc16:%u'|/system/bin/toybox nc 192.168.2.155 1500</a></p>
<p><a href="i:03Send url(fullscreen)::printf 'i:5f%u'|/system/bin/toybox nc 192.168.2.155 1500">Send url(fullscreen)::printf 'i:5f%u'|/system/bin/toybox nc 192.168.2.155 1500</a></p>
<p><a href="i:03Send url(video)::printf 'i:0mc16:%u'|/system/bin/toybox nc 192.168.2.155 1500">Send url(video)::printf 'i:0mc16:%u'|/system/bin/toybox nc 192.168.2.155 1500</a></p>
<p><a href="i:03Send url(clipboard):clip:(printf 'i:5b';cat)|/system/bin/toybox nc 192.168.2.155 1500">Send url(clipboard):clip:(printf 'i:5b';cat)|/system/bin/toybox nc 192.168.2.155 1500</a></p>
<p>Modify with your own info:<br>
<a href="i:03dynv6_sim1:uweb:print 'http://dynv6.com/api/update?hostname=&token=&ipv6=';ip addr|grep 'inet6 [^f]'|grep global|grep -v temporary|head -n 1|sed 's/^.*inet6 //'|sed 's/\/.*$//'">Refresh dynv6 ddns for sim card 1</a></p>
<p><a href="i:03dynv6_wifi:uweb:print 'http://dynv6.com/api/update?hostname=&token=&ipv6=';ip addr|grep 'inet6 [^f]'|grep global|grep -v temporary|tail -n 1|sed 's/^.*inet6 //'|sed 's/\/.*$//'">Refresh dynv6 ddns for wifi</a></p>
<p>Need root permissions:</p>
<p>Need termux:<br>
<a href="i:03VPN::am start -a android.net.vpn.SETTINGS">VPN::am start -a android.net.vpn.SETTINGS</a></p>
<p><a href="i:03wireless::am start -a android.settings.WIRELESS_SETTINGS">wireless::am start -a android.settings.WIRELESS_SETTINGS</a></p>
<p><a href="i:03cd:termux/*:cd %f;exit 1">cd:termux/*:cd %f;exit 1</a></p>
<p><a href="i:03vim:termux/*:vim %f">vim:termux/*:vim %f</a></p>
<p><a href="i:03deduplicate history::awk -F'\t' '!s[\$2]++' /data/data/info.torapp.uweb/files/history.rec>/sdcard/a.tmp;mv /sdcard/Download/a.tmp /data/data/info.torapp.uweb/files/history.rec">deduplicate history::awk -F'\t' '!s[$2]++' /data/data/info.torapp.uweb/files/history.rec&gt;/sdcard/a.tmp;mv /sdcard/Download/a.tmp /data/data/info.torapp.uweb/files/history.rec</a></p>
<p><a href="i:03deduplicate bookmarks::awk '!s[\$0]++' /data/data/info.torapp.uweb/files/bookmark.html>/sdcard/Download/a.tmp;mv /sdcard/Download/a.tmp /data/data/info.torapp.uweb/files/bookmark.html">deduplicate bookmarks::awk '!s[$0]++' /data/data/info.torapp.uweb/files/bookmark.html&gt;/sdcard/Download/a.tmp;mv /sdcard/Download/a.tmp /data/data/info.torapp.uweb/files/bookmark.html</a></p>
<p><a href="i:03deduplicate hosts::toybox tac /data/data/info.torapp.uweb/files/default.hosts|awk -F' ' '!s[\$1]++' |toybox tac>/sdcard/Download/a.tmp;mv /sdcard/Download/a.tmp /data/data/info.torapp.uweb/files/default.hosts">deduplicate hosts::toybox tac /data/data/info.torapp.uweb/files/default.hosts|awk -F' ' '!s[$1]++' |toybox tac&gt;/sdcard/Download/a.tmp;mv /sdcard/Download/a.tmp /data/data/info.torapp.uweb/files/default.hosts</a></p>
<p><a href="i:03deduplicate siteconf::toybox tac /data/data/info.torapp.uweb/files/default.siteconf|awk -F':' '!s[\$1]++' |toybox tac>/sdcard/Download/a.tmp;mv /sdcard/Download/a.tmp /data/data/info.torapp.uweb/files/default.siteconf">deduplicate siteconf::toybox tac /data/data/info.torapp.uweb/files/default.siteconf|awk -F':' '!s[$1]++' |toybox tac&gt;/sdcard/Download/a.tmp;mv /sdcard/Download/a.tmp /data/data/info.torapp.uweb/files/default.siteconf</a></p>
<p><a href="i:03Clipboard2PC:clip:ssh fengcao@192.168.1.120 'DISPLAY=:0 xsel -i'">Clipboard2PC:clip:ssh fengcao@192.168.1.120 'DISPLAY=:0 xsel -i'</a></p>
<p><a href="i:03PC2Clipboard:/clip:ssh fengcao@192.168.1.120 'DISPLAY=:0 xsel -o'">PC2Clipboard:/clip:ssh fengcao@192.168.1.120 'DISPLAY=:0 xsel -o'</a></p>
<p><a href="i:03Clipboard broadcast:clip:socat - UDP-DATAGRAM:255.255.255.255:1500,broadcast">Clipboard broadcast:clip:socat - UDP-DATAGRAM:255.255.255.255:1500,broadcast</a></p>
<p><a href="i:03Clipboard from broadcast:/clip:socat -u udp-recvfrom:1500 SYSTEM:'cat;exit'">Clipboard from broadcast:/clip:socat -u udp-recvfrom:1500 SYSTEM:'cat;exit'</a></p>
<p><a href="i:03Clipboard2QR:clip/uweb:qrencode -o /sdcard/Download/a.png;echo file:///sdcard/Download/a.png">Clipboard2QR:clip/uweb:qrencode -o /sdcard/Download/a.png;echo file:///sdcard/Download/a.png</a></p>
<p>Clipboard2PC needs to modify username, PC needs xsel. ssh needs to be installed inside termux (apt install openssh).<br>
Clipboard broadcast needs socatapt install socat)。<br>
Clipboard2QR needs libqrencode.</p>
<h4 id="more-commands-click-to-install">More commands (click to install)</h4>
<p><a href="i:0gdefault.cmds::mdme:text/html:echo %22<script src=https://fastly.jsdelivr.net/npm/mdme></script><textarea>%22;cat %25f%0A">mdme: Show local markdown file</a></p>
<p><a href="i:0gdefault.cmds::texme:text/html:echo %22<script src=https://fastly.jsdelivr.net/npm/texme></script><textarea>%22;cat %25f%0A">texme: Show local tex+markdown file</a></p>
<p><a href="i:0gdefault.cmds::markdeep:text/html:cat %25f;echo %22<style class=fallback>body{visibility:hidden;white-space:pre;font-family:monospace}</style><script src=https://casual-effects.com/markdeep/latest/markdeep.min.js charset=utf-8></script><script>window.alreadyProcessedMarkdeep||(document.body.style.visibility=visible)</script>%22%0A">markdeep: Show local markdown+tex+diagrams file</a></p>
<p><a href="i:0gdefault.cmds::markdeep slide:text/html:cat %25f;echo %22<link rel='stylesheet' href='https://casual-effects.com/markdeep/latest/slides.css?'><script>markdeepOptions={tocStyle:'none'}</script><script src=https://casual-effects.com/markdeep/latest/markdeep.min.js charset=utf-8></script>%22%0A">markdeep slide: markdown+tex+diagrams</a></p>
<p><a href="i:0gdefault.cmds::remark slide:text/html:echo %22<script src=https://remarkjs.com/downloads/remark-latest.min.js></script><script>window.onload=function(){var slideshow=remark.create({navigation:{click:true,},});}</script><textarea id=%27source%27>class:middle%22;cat %25f%0A">remark slide: slide show for local markdown file</a></p>
<p><a href="i:0gdefault.cmds:https://cdn.jsdelivr.net/gh/torappinfo/uweb/en/searchurl/txt/cmds.cfg">Code editor, open url in clipboard etc.</a></p>
<h4 id="cmds-file-format">&quot;.cmds&quot; file format</h4>
<p>Each line has the following format:<br>
[Name]:[mimetype]:[command line]</p>
<p>[command line] can have &quot;%c&quot; (cookie), &quot;%s&quot; (address bar text), &quot;%u&quot; (url), &quot;%t&quot; (title).<br>
[mimetype] have the following formats:</p>
<ul>
<li>regular mimetype such as &quot;text/html&quot; to indicate the content type of the command output. Ex. &quot;text/javascript&quot; makes browser to evaluate the js code.</li>
<li>&quot;clip/clip&quot; to indicate &quot;clipboard&quot; as input and the command output is copied to clipboard.</li>
<li>&quot;/clip&quot;: copy the command output to clipboard.</li>
<li>&quot;clip/text/html&quot; : clipboard as input, and the command output is processed as &quot;text/html&quot;.</li>
<li>&quot;termux/*&quot;: command line is executed under termux.</li>
<li>&quot;/uweb&quot;: the command output is processed as <a href="../links/index.html#">links</a>.</li>
<li>&quot;q&quot;: quit the app and then execute the command. It is useful for complete cleanup operations.</li>
<li>empty:
<ul>
<li>if the first or second character of [command line] is ':', then the [command line] executes as <a href="../links/index.html#">internal link</a>.</li>
</ul>
</li>
</ul>
</div>
<p>Last Modified: 30 March 2025<br>
tar -C / raised permission denied error<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

35
en/download.md Normal file
View file

@ -0,0 +1,35 @@
[github](https://github.com/torappinfo/uweb/releases/tag/v1)
[sourceforge](https://sourceforge.net/projects/uwebbrowser/files/v1/)
[![](https://stc.utdstc.com/img/mediakit/download-gio-big.png)](https://uweb-browser-for-geeks.en.uptodown.com/android "uweb")
[powerfolder](https://my.powerfolder.com/getlink/fi61cC6VHjK72tfufmnLAz/)
[codeberg](https://codeberg.org/jamesfengcao/pages/releases)
[infinicloud](https://uno.teracloud.jp/share/1162dfa8376e1609)
[gitee](https://gitee.com/jamesfengcao/uweb/releases)
[gitea](https://gitea.com/torappinfo/uweb/releases)
[gitdab](https://gitdab.com/jamesfengcao/uweb/releases)
[gitnet](https://gitnet.fr/jamesfengcao/uweb/releases)
[tildegit](https://tildegit.org/jamesfengcao/uweb/releases)
[NotABug](https://notabug.org/torappinfo/uweb/releases)
[pagure](https://releases.pagure.org/uwebapk/)
[baidu](https://pan.baidu.com/s/17coQj6DCHqghMMNJUyjgrA#list/path=%2Fuweb)
[蓝奏](https://pan.lanzouu.com/b0qpxnob)

View file

@ -0,0 +1,81 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/ebrowser/eb_select/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Text selection</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Text selection
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<p>Click the following links to install context menus for text selection.</p>
</div>
<p>Last Modified: 12 July 2024<br>
reorg ebrowserreadme.md<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

8
en/ebrowser/index.html Normal file
View file

@ -0,0 +1,8 @@
<!doctype html>
<html>
<body>
<ul>
</ul>
</body>
</html>

19
en/ebrowser/index.xml Normal file
View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Ebrowsers on uweb browser: unlimited power</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/ebrowser/</link>
<description>Recent content in Ebrowsers on uweb browser: unlimited power</description>
<generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Fri, 12 Jul 2024 10:48:12 +0800</lastBuildDate>
<atom:link href="https://jamesfengcao.gitlab.io/uweb/en/ebrowser/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Text selection</title>
<link>https://jamesfengcao.gitlab.io/uweb/en/ebrowser/eb_select/</link>
<pubDate>Fri, 12 Jul 2024 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/ebrowser/eb_select/</guid>
<description>&lt;p&gt;Click the following links to install context menus for text selection.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View file

@ -0,0 +1,260 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/ebrowserreadme/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title></title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<script>function notRepo(){let u=location.href.replace(/#$/, '');return u.endsWith('index.html')||u.endsWith('readme/');}</script>
<!--%3cmeta http-equiv=refresh content=%220;url=%68ttps://gitee.com/jamesfengcao/uweb/raw/master/redirect.html#%22%3e-->
<h1 id="ebrowser-keyboard-friendly-minimal-suckless-web-browser"><a href="https://github.com/torappinfo/ebrowser">Ebrowser</a>: keyboard-friendly minimal suckless web browser</h1>
<p>Ebrowser is designed with the philosophy of <a href="https://github.com/torappinfo/uweb">Android uweb browser</a> (<a href="https://gitlab.com/jamesfengcao/uweb">gitlab</a>).</p>
<ul>
<li>lightweight (less than 20k bytes) without bundled electron.</li>
<li>much less memory footprint than edge/chrome browser and highly performant.</li>
<li>keyboard friendly with vim-style keymaps and command line support in address bar.</li>
<li><a href="https://uweb.surge.sh/en/redirect/index.html#" onclick="if(notRepo()){location='../redirect/index.html#';return false;}">global redirection</a> to bypass censorship.</li>
<li>user CSS/JS at will. Ex. pressing <code>md</code> in no-focus mode to preview markdown file.</li>
<li>global CSS/JS for all sites at will.</li>
<li>CSS/JS for domains, similar to <a href="https://jamesfengcao.gitlab.io/uweb/en/sitejs/index.html">uweb</a>, but use sitejs/[domain].js or sitecss/[domain].css, not [domain root].js/css.</li>
<li>customizable.</li>
<li>dark theme support.</li>
</ul>
<blockquote>
<p>Note: Usually electron apps are heavyweight as they use browsers for simple things. Ebrowser uses core chromium effectively and very lightweight.</p>
</blockquote>
<h2 id="installing-for-windows-macos-and-linux">Installing (for Windows, MacOS and Linux)</h2>
<h3 id="install-with-prebuilt-binaries">Install with prebuilt binaries</h3>
<p>You can find prebuilt binaries <a href="https://github.com/torappinfo/ebrowser/releases">here</a>.</p>
<h3 id="install-ebrowser-and-electron-separatedly-recommended">Install ebrowser and electron separatedly (Recommended)</h3>
<h4 id="install-ebrowser">Install ebrowser</h4>
<p>Either download (Click the green <code>Code</code> button above the file list =&gt; Select <code>Download ZIP</code>) and unzip from</p>
<pre><code>https://github.com/torappinfo/ebrowser
</code></pre>
<p>OR download and unzip ebrowser package directly from any of npm mirror sites like <a href="https://npmmirror.com/package/ebrowser">npmmirror</a> or with nodejs by</p>
<pre><code>npm install ebrowser
</code></pre>
<p>OR download/<code>git clone</code> files directly from any of <a href="https://gitlab.com/jamesfengcao/uweb/-/blob/master/en/mirrors.md">mirror repositories</a> and ebrowser is under the folder <code>misc/ebrowser</code>.</p>
<h4 id="install-electron">Install electron</h4>
<p>Before you can run ebrowser, you need to install electron either with nodejs by</p>
<pre><code>npm install electron
</code></pre>
<p>OR download and unzip electron binary directly from <a href="https://github.com/electron/electron/releases">github</a> or mirrors like <a href="https://registry.npmmirror.com/binary.html?path=electron">npmmirror</a>.</p>
<h4 id="run-ebrowser">Run ebrowser</h4>
<pre><code>electron ~/node_modules/ebrowser
</code></pre>
<p>OR</p>
<pre><code>electron [the-path-of-folder-with-downloaded-ebrowser-files]
</code></pre>
<h3 id="update-app-quickly-without-updating-chromium">Update app quickly without updating chromium</h3>
<p>Pressing <code>Alt</code> to show the menu bar and choose <code>Check for updates</code> under <code>Help</code>. OR</p>
<p>Type <code>:update</code> in the address bar and press <code>enter</code> key to update.</p>
<h2 id="key-shortcuts">Key shortcuts</h2>
<ul>
<li>Alt: show menu</li>
<li>ALT+&lt;-: go backward</li>
<li>ALT+-&gt;: go forward</li>
<li>CTRL+C: stop loading</li>
<li>CTRL+G: address bar to show page url</li>
<li>CTRL+L: focus to address bar</li>
<li>CTRL+T: new Tab</li>
<li>CTRL+SHIFT+T: restore closed Tab</li>
<li>CTRL+TAB: switch to next tab</li>
<li>CTRL+SHIFT+TAB: switch to previous tab</li>
<li>CTRL+W: close Tab</li>
<li>CTRL+SHIFT+R: enable global redirection (<code>gredirect.json</code>)</li>
<li>CTRL+R: disable global redirection</li>
<li>ESC: remove focus. similar to vi normal mode.</li>
<li>F1: Help</li>
<li>F5: page refresh/reload</li>
<li>F12: devtools</li>
</ul>
<h2 id="address-bar-commands">Address bar commands</h2>
<p>Like any popular browser, the very first word in address bar if defined in <code>search.json</code> identifies a <a href="https://jamesfengcao.gitlab.io/uweb/en/search/index.html" onclick="if(notRepo()){location='../search/index.html#';return false;}">search engine</a>. Moreover, the address bar serves as command line interface:</p>
<ul>
<li>&quot;/&quot; for find-in-page</li>
<li>&quot;:&quot; for address bar commands
<ul>
<li>ac [bookmark/history path w/o ext] : load <code>.rec</code> file for autocomplete.</li>
<li>b [bookmarkfilename w/o ext] : bookmark current page in file.</li>
<li>bjs : Browser-level JavaScript execution.</li>
<li>bml [filename w/o extension] [arguments...]: load/execute the javascript file.</li>
<li>cert : allow invalid certificates w/o arguments, otherwise restore to default.</li>
<li>clear : the arguments could be
<ul>
<li>cache : clear cache</li>
<li>dns : clear dns cache</li>
<li>storage: clear site storage data.</li>
<li>{<a href="https://www.electronjs.org/docs/latest/api/session#sescleardataoptions">options</a>}</li>
</ul>
</li>
<li>exit : exit browser</li>
<li>ext [extension path]: load unpacked Chrome extension.</li>
<li>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.</li>
<li>js [js code] : execute JS code at OS level. Note: &quot;javascript:...&quot; is special url and thus works in the current web page, while &quot;:js ...&quot; commands can do any OS operations.</li>
<li>nc/uc : No Cookie forwarding/Use Cookie forwarding with global redirection.</li>
<li>nr/ur for No/Use &quot;redirect.json&quot; for domain redirection.</li>
<li>np : no proxy.</li>
<li>up [proxyName] : use proxy. privous proxy or the first proxy in proxy.json w/o [proxyName]. &quot;:up&quot; command also disables global and domain redirections, which are not restored by &quot;:np&quot;.</li>
<li>sys [command line] : execute system commands with url as one of arguments, and replace &quot;%cookie&quot; with corresponding one. Ex. &quot;curl&quot; commands for uploading.</li>
<li>ua [useragentName] : set user agent for future tabs. default user agent w/o arguments.</li>
<li>update [filename] : update the app w/o argument, otherwise retrive the [filename] from remote. The filename could be any file on <a href="https://jamesfengcao.gitlab.io/uweb/en/readme/index.html">mirror sites</a> (this repository is part of it).</li>
<li>pdf [filename w/o extension] {<a href="https://www.electronjs.org/docs/latest/api/web-contents#contentsprinttopdfoptions">options</a>} : print to PDF file. All arguments are optional; empty option &quot;{}&quot; to capture long screenshot as vector graphics.</li>
</ul>
</li>
<li>&quot;!&quot; address bar commands
<ul>
<li>&quot;!xx ...&quot; evaluates &quot;xx.js&quot; with the whole text as arguments[0] at OS level.</li>
<li>&quot;!!xx ...&quot; evaluates &quot;xx.js&quot; with the whole text as arguments[0] at browser level, which could manipulate address bar etc.</li>
</ul>
</li>
<li>i: internal urls, which will be consistent with <a href="https://jamesfengcao.gitlab.io/uweb/en/links/index.html">uweb</a>.
<ul>
<li>&quot;i:0/js/xxx.js:[url]&quot; loads the &quot;[url]&quot; with bookmarklet &quot;js/xxx.js&quot;.</li>
<li>&quot;i:8d[url]&quot; fo force downloading</li>
</ul>
</li>
</ul>
<h2 id="commands-in-no-focus-mode-this-mode-is-similar-to-vi-normal-mode">Commands in no-focus mode (this mode is similar to vi Normal mode)</h2>
<p>Pressing &quot;ESC&quot; to enter no-focus mode if not sure.</p>
<ul>
<li>&quot;:&quot; for address bar commands</li>
<li>&quot;/&quot; for find-in-page with address bar</li>
<li>&quot;!&quot; for &quot;!&quot; address bar commands</li>
</ul>
<p>The other commands are defined in &quot;mapkeys.json&quot;, which will map keys to address bar commands.</p>
<h2 id="configuration-files">Configuration files</h2>
<ul>
<li>&quot;config&quot;: lines of address bar commands.</li>
<li>&quot;search.json&quot;: <a href="https://jamesfengcao.gitlab.io/uweb/en/search/index.html" onclick="if(notRepo()){location='../search/index.html#';return false;}">search engines</a> as shortcut-queryUrl pairs, where &quot;%s&quot; would be replaced by search query.</li>
<li>&quot;default.autoc&quot;: predefined strings for address bar auto completion.</li>
<li>&quot;gredirect.json&quot;: global redirection urls as array of urls</li>
<li>&quot;redirect.json&quot;: domain-replacementDomain pairs, default to be applied.</li>
<li>&quot;mapkeys.json&quot;: keys-addressbarCommands pairs. The addressbar commands are multiple lines of address bar command separated by &quot;\n&quot;.</li>
<li>&quot;proxy.json&quot;: name-<a href="https://www.electronjs.org/docs/latest/api/structures/proxy-config">ProxyConfig</a> pairs</li>
<li>&quot;uas.json&quot; : name-<a href="https://jamesfengcao.gitlab.io/uweb/en/useragents/index.html" onclick="if(notRepo()){location='../useragents/index.html#';return false;}">useragent</a> pairs.</li>
<li>Customized menus: json files as array of strings with menuitem name and address bar commands alternately.
<ul>
<li>&quot;menu.json&quot;: array of strings for <a href="https://jamesfengcao.gitlab.io/uweb/en/urls/index.html" onclick="if(notRepo()){location='../urls/index.html#';return false;}">user-defined menus</a>. The array has submenu name and address bar commands alternately. The odd-indexed strings are address bar commands with &quot;%u&quot; as the downloaded url.</li>
<li>&quot;select.json&quot;: to define menus for text selections. The odd-indexed strings are address bar commands with &quot;%s&quot; as the text selection.</li>
<li>&quot;download.json&quot; : array of strings to define context menu and buttons for downloading dialog. The even-indexed strings are texts to show on the button. The odd-indexed strings are address bar commands with &quot;%u&quot; as the downloaded url.</li>
</ul>
</li>
</ul>
<h2 id="javascript-at-three-levels">Javascript at three levels</h2>
<ul>
<li>Web page: url like &quot;javascript:&quot; or bookmarklet command &quot;:bml&quot; runs in web page.</li>
<li>Browser (or renderer process) :
<ul>
<li>&quot;:bjs&quot; to execute the following js code at browser level.</li>
</ul>
</li>
<li>OS level (or main process) : &quot;:js&quot; to execute the following js code with all OS APIs available.
<ul>
<li>&quot;!xx&quot; evaluates &quot;xx.js&quot; with arguments.</li>
</ul>
</li>
</ul>
<h3 id="examples-for-jsbjs-commands">examples for &quot;:js&quot;/&quot;:bjs&quot; commands</h3>
<pre><code>: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
</code></pre>
<h2 id="new-usages">New usages</h2>
<ul>
<li>
<p>Vector designing with web tech to replace Adobe Illustrator/Inkscape.</p>
<ul>
<li>
<p>Design with web tech.</p>
</li>
<li>
<p>Printing to pdf with customized paper size.</p>
</li>
<li>
<p>Magnify the pdf paper size to the required size.</p>
</li>
</ul>
<p>OR</p>
<ul>
<li>Adjust window width and use addressbar command line &quot;:Pdf {}&quot; to export vector graphics.</li>
<li>Use imageMagick to convert to any other vector graphics format.</li>
</ul>
</li>
</ul>
<h2 id="license">License</h2>
<p>You can copy or modify the code/program under the terms of the GPL3.0 or later versions.</p>
</div>
<p>Last Modified: 8 December 2025<br>
use ` for terms<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

View file

@ -3,10 +3,11 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/filecap/" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Custom file handling</title> <title>Custom file handling</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +29,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a> <a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
@ -46,9 +47,9 @@
</h1> </h1>
<ul class="tags"> <ul class="tags">
<li><a href="../tags/termux">termux</a> </li> <li><a href="../tags/termux/index.html#">termux</a> </li>
<li><a href="../tags/curl">curl</a> </li> <li><a href="../tags/curl/index.html#">curl</a> </li>
</ul> </ul>
<p>Long press the settings button, check the option &quot;custom file handling&quot; to enable the functionality.</p> <p>Long press the settings button, check the option &quot;custom file handling&quot; to enable the functionality.</p>
@ -56,7 +57,7 @@
[file extension]:[mimetype]:[command line]</p> [file extension]:[mimetype]:[command line]</p>
<p>The &quot;[file extension]&quot; part can have at most two-segment of extensions such as &quot;txt.xz&quot;,&quot;html.gz&quot;.<br> <p>The &quot;[file extension]&quot; part can have at most two-segment of extensions such as &quot;txt.xz&quot;,&quot;html.gz&quot;.<br>
&quot;[mimetype]&quot; indicates the type of &quot;[command line]&quot; output.<br> &quot;[mimetype]&quot; indicates the type of &quot;[command line]&quot; output.<br>
&quot;[command line]&quot; is same as the one in <a href="../searchurl/cmds.html">default.cmds</a>. The most often used replacements are:<br> &quot;[command line]&quot; is same as the one in <a href="../cmds/index.html#">default.cmds</a>. The most often used replacements are:<br>
%u (url), %U (urlencoded url), %c (cookie), %p (site password, curl format).</p> %u (url), %U (urlencoded url), %c (cookie), %p (site password, curl format).</p>
<p>default.filecap example:</p> <p>default.filecap example:</p>
<pre><code>txt:text/html:curl %p "%u" <pre><code>txt:text/html:curl %p "%u"
@ -72,12 +73,41 @@ docx:uweb:echo http://docs.google.com/gview?embedded=true&url=%U
xlsx:uweb:echo http://docs.google.com/gview?embedded=true&url=%U xlsx:uweb:echo http://docs.google.com/gview?embedded=true&url=%U
pptx:uweb:echo http://docs.google.com/gview?embedded=true&url=%U pptx:uweb:echo http://docs.google.com/gview?embedded=true&url=%U
xz:text/plain:curl %p "%u"|xz -d --</code></pre> xz:text/plain:curl %p "%u"|xz -d --</code></pre>
<p>Examples for <a href="../html5/index.html">html5 application</a>:</p> <p>Examples for <a href="../html5/index.html#">html5 application</a>:</p>
<pre><code>pdf:uweb:echo file:///data/data/info.torinfo.uweb/files/app/pdf.js/web/viewer.html?file=%u <pre><code>pdf:uweb:echo file:///data/data/info.torapp.uweb/files/app/pdf.js/web/viewer.html?file=%u
djvu:uweb:echo file:///data/data/info.torinfo.uweb/files/app/djvu.html?url=%u djvu:uweb:echo file:///data/data/info.torapp.uweb/files/app/djvu.html?url=%u
epub:uweb:echo file:///data/data/info.torinfo.uweb/files/app/reader/index.html?bookPath==%u</code></pre> epub:uweb:echo file:///data/data/info.torapp.uweb/files/app/reader/index.html#?bookPath==%u</code></pre>
</div> </div>
<p>Last Modified: 2 April 2024<br>
add js function in README<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

90
en/filemanager/index.html Normal file
View file

@ -0,0 +1,90 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/filemanager/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>File manager</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">File manager
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<p>Visiting file urls ending with &quot;/&quot; enters internal file manager.</p>
<p>When the current tab is internal file manager, visiting file url for a file shows the content of the file, long pressing button &quot;🕔&quot; -&gt; Editor loads line-based editor for the file. If the file does not exist, saving creates a new file.</p>
<p>Running any command with address bar with the format &quot;d::command line:&quot; to execute &quot;command line&quot; in the current folder of the internal file manager. Ex:<br>
&quot;d::touch a.txt:&quot; to create a new file a.txt.<br>
&quot;d::mkdir subdir:&quot; to create a new folder names &quot;subdir&quot;.<br>
&quot;d::mv old new:&quot; to rename the file &quot;old&quot; to be &quot;new&quot;.</p>
</div>
<p>Last Modified: 5 December 2025<br>
add filemanager.md<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

View file

@ -3,10 +3,11 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/filenames/" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Configuration folders/files</title> <title>Configuration folders/files</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +29,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a> <a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
@ -48,58 +49,95 @@
</ul> </ul>
<p>All folders end with character &quot;/&quot; and others are files. All folders/files locate in &quot;/data/data/info.torapp.uweb/files&quot;:<br> <p>All folders end with character &quot;/&quot; and others are files. All folders/files locate in &quot;/data/data/info.torapp.uweb/files&quot;:<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/css/">css/</a>&quot;: <a href="../globalcss/index.html">global css folder</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/css/">css/</a>&quot;: <a href="../globalcss/index.html#">global css folder</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/js/">js/</a>&quot;: global script folder<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/js/">js/</a>&quot;: <a href="../rjs/index.html#">global script folder</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/sitejs/">sitejs/</a>&quot;: <a href="../sitejs/index.html">script folder for domains</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/sitejs/">sitejs/</a>&quot;: <a href="../sitejs/index.html#">script folder for domains</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/sitecss/">sitecss/</a>&quot;:<a href="../sitejs/index.html">CSS folder for domains</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/sitecss/">sitecss/</a>&quot;:<a href="../sitejs/index.html#">CSS folder for domains</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/bookmarklet/">bookmarklet/</a>&quot;:bookmarklets, long pressing the &quot;JS&quot; button to execute.<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/bookmarklet/">bookmarklet/</a>&quot;:<a href="../rjs/index.html#">bookmarklets</a>, long pressing the &quot;JS&quot; button to execute.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/offline/">offline/</a>&quot;: to save offline pages<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/offline/">offline/</a>&quot;: to save offline pages<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/sbookmark/">sbookmark/</a>&quot;: to save super bookmarks<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/sbookmark/">sbookmark/</a>&quot;: to save super bookmarks<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/sitecache/">sitecache/</a>&quot;:<a href="../offlinecache/index.html">offline cache</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/sitecache/">sitecache/</a>&quot;:<a href="../offlinecache/index.html#">offline cache</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/longclick/">longclick/</a>&quot;: menus to appear when long-pressing hypertext (js files)<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/longclick/">longclick/</a>&quot;: menus to appear when long-pressing hypertext (js files)<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/icon/">icon/</a>&quot;:<a href="../icons/index.html">customized icons</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/icon/">icon/</a>&quot;:<a href="../icons/index.html#">customized icons</a><br>
&quot;app[XXX]/&quot;:<a href="../html5/index.html">html5 applications</a><br> &quot;app[XXX]/&quot;:<a href="../html5/index.html#">html5 applications</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.longclick">default.longclick</a>&quot;: to configure menus when long-pressing hypertext.<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.longclick">default.longclick</a>&quot;: to configure menus when long-pressing hypertext.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.uas">default.uas</a>&quot;:<a href="../searchurl/uas.html">user agents</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.uas">default.uas</a>&quot;:user agents<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.urls">default.urls</a>&quot;:<a href="../searchurl/urls.html">service urls</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.bml">default.bml</a>&quot;:<a href="../rjs/index.html#">bookmarklets</a>, long pressing the &quot;JS&quot; button to execute.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.acmd">default.acmd</a>&quot;:<a href="../gnuplot/index.html">configure address bar functionalities</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.urls">default.urls</a>&quot;:<a href="../urls/index.html#">service urls</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.hosts">default.hosts</a>&quot;:<a href="../adblock_hosts/index.html">hosts not allowed to visit</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.acmd">default.acmd</a>&quot;:configure address bar functionalities<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.redirect">default.redirect</a>&quot;:<a href="../redirect/index.html">redirect websites</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/hosts">hosts</a>&quot;: for local <a href="../adblock_domain/index.html#">domain name attributes</a>, only single space is allowed to separate ip address and domain name.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.cmds">default.cmds</a>&quot;:<a href="../searchurl/cmds.html">commands</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.hosts">default.hosts</a>&quot;:<a href="../adblock/index.html#">hosts not allowed to visit</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.link">default.link</a>&quot;:<a href="../links/index.html">links</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.redirect">default.redirect</a>&quot;:<a href="../redirect/index.html#">redirect websites</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.rjs">default.rjs</a>&quot;:<a href="../rjs/index.html">Remote javascript</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.cmds">default.cmds</a>&quot;:<a href="../cmds/index.html#">commands</a></p>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.select">default.select</a>&quot;:<a href="../pccopy/index.html">menus for selected text</a><br> <p>&quot;<a href="i:5gfile:///data/data/info.torapp.uweb/files/default.link">default.link</a>:<a href="../links/index.html#">links</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.input">default.input</a>&quot;: common phrases for user inputs<br> &quot;<a href="i:5gfile:///data/data/info.torapp.uweb/files/download.link">download.link</a>:Also <a href="../links/index.html#">links</a> file, but default to be &quot;command&quot; submenu for download options menu.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.gesture">default.gesture</a>&quot;: to define <a href="../gesture/index.html">gestures on the top part of the content window</a>. The file format is same as <a href="../links/index.html">default.link</a><br> &quot;<a href="i:5gfile:///data/data/info.torapp.uweb/files/image.link">image.link</a>:Also <a href="../links/index.html#">links</a> file, but default to be &quot;command&quot; submenu for images for long press links.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.gesture2">default.gesture2</a>&quot;: gestures on the right side similar to default.gesture.<br> &quot;<a href="i:5gfile:///data/data/info.torapp.uweb/files/context.link">context.link</a>:Also <a href="../links/index.html#">links</a> file, but default to be &quot;command&quot; submenu for context menu.</p>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.button">default.button</a>&quot;: to re-define button pressing functionalities. The file format is same as <a href="../links/index.html">default.link</a>, each line represents action from the last button to the first.<br> <p>&quot;<a href="file:///data/data/info.torapp.uweb/files/default.rjs">default.rjs</a>&quot;:<a href="../rjs/index.html#">Remote javascript</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.button2">default.button2</a>&quot;: similar to default.button but for long-pressed buttons.<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.select">default.select</a>&quot;:<a href="../textprocess/index.html#">menus for selected text</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.filecap">default.filecap</a>&quot;:<a href="../filecap/index.html">custom file handling</a><br> &quot;<a href="i:5gfile:///data/data/info.torapp.uweb/files/default.input">default.input</a>: <a href="../input/index.html#">common phrases for user inputs</a>. If the phrase begins with &quot;@xxxx@&quot;, then &quot;xxxx&quot; part is the alias for the rest part of the string. Alias could be used for non-printable phrase.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.rc">default.rc</a>&quot;: check the option &quot;custom file handling&quot; to execute the shell script file during uweb launching. <a href="../tools/index.html">tcron</a> provides extra cron tools.<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.gesture">default.gesture</a>&quot;: to define <a href="../gesture/index.html#">gestures on the top part of the content window</a>. The file format is same as <a href="../links/index.html">default.link</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.rc2">default.rc2</a>&quot;: check the option &quot;custom file handling&quot; to execute the shell script file when uweb returns to foreground.<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.gesture2">default.gesture2</a>&quot;: gestures on the right side similar to default.gesture.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/engine.search">engine.search</a>&quot;: to define quick search engines (pressing right arrow button to use next engine to search). The file format is similar to <a href="../searchurl/search.html">home5.search</a> but using &quot;%s&quot; as search keywords.<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.button">default.button</a>&quot;: to re-define button pressing functionalities. The file format is same as <a href="../links/index.html#">default.link</a>, each line represents action from the last button to the first.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.siteconf">default.siteconf</a>&quot;: to save ua, js disabling, no-image mode, forbids 3rd-party resources (js and others), active scripts, global scripts for sites. Only save the difference to default ones.<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.button2">default.button2</a>&quot;: similar to default.button but for long-pressed buttons.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.playrate">default.playrate</a>&quot;: fullscreen playing menu. The file format is same as <a href="../links/index.html">default.link</a>. Playing ratio menu items should have empty link parts such as &quot;.5x:&quot;, at least one such menu is required. All other menus must be put after playing ratio menus.<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.filecap">default.filecap</a>&quot;:<a href="../filecap/index.html#">custom file handling</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.autoc">default.autoc</a>&quot;: address bar autocomplete candidate strings.<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.rc">default.rc</a>&quot;: check the option &quot;custom file handling&quot; to execute the shell script file during uweb launching. <a href="../tools/index.html#">tcron</a> provides extra cron tools.<br>
&quot;query.autoc&quot;: home screen search autocomplete candidate strings.<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.rc2">default.rc2</a>&quot;: check the option &quot;custom file handling&quot; to execute the shell script file when uweb returns to foreground.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/home5.html">home5.html</a>&quot;: user defined home screen. home6.html, home6.search, home7.html ... multiple home screen (pressing right arrow button to visit. &quot;.html&quot; files have priority over &quot;.search&quot; files. home4.html, home4.search, home3.html ... (long pressing left arrow button to access).<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/crontab">crontab</a>&quot;:<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/home5.search">home5.search</a>&quot;:<a href="../searchurl/search.html">search engines</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/engine.search">engine.search</a>&quot;: to define quick search engines (pressing right arrow button to use next engine to search). The file format is similar to <a href="../search/index.html#">home5.search</a> but using &quot;%s&quot; as search keywords. If the search engine urls in &quot;engine.search&quot; are video urls (without %s inside), the file will make uweb browser optimized for TV watching with remote control.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/home.css">home.css</a>&quot;: <a href="../searchurl/homescreen.html">home screen styles</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.siteconf">default.siteconf</a>&quot;: to save ua, js disabling, no-image mode, forbids 3rd-party resources (js and others), active scripts, global scripts for sites. Only save the difference to default ones.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/bookmark.html">bookmark.html</a>&quot;: bookmarks<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.playrate">default.playrate</a>&quot;: fullscreen playing menu. The file format is same as <a href="../links/index.html#">default.link</a>. Playing ratio menu items should have empty link parts such as &quot;.5x:&quot;, at least one such menu is required. All other menus must be put after playing ratio menus.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/quickstart.html">quickstart.html</a>&quot;: <a href="../searchurl/quickstart.html">quick start</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.autoc">default.autoc</a>&quot;: address bar autocomplete candidate strings.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/colors.txt">colors.txt</a>&quot;: background colors<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/query.autoc">query.autoc</a>&quot;: home screen search autocomplete candidate strings.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/default.css">default.css</a>&quot;: <a href="../sitejs/index.html">default CSS style for domains not defined in sitejs folder</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/home5.html">home5.html</a>&quot;: user defined home screen. home6.mht(or .search or .html), home7.mht(or .search or .html) ... multiple home screen (pressing right arrow button to visit; home4.mht(or .search or .html), home3.mht(or .html or .search) ... (long pressing left arrow button to access).<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/night.css">night.css</a>&quot;: <a href="../globalcss/index.html">Night mode</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/home5.search">home5.search</a>&quot;:<a href="../search/index.html#">search engines</a><br>
&quot;bookmarklet/videoplayer.js&quot;: <a href="../video/index.html">fullscreen video player</a><br> &quot;<a href="file:///data/data/info.torapp.uweb/files/home.css">home.css</a>&quot;: <span style="color:red">html</span> file for <a href="../bookmark/index.html#">folder/home screen/bookmark styling</a>, so the css code needs to be inside &quot;&lt;style&gt;&quot; elements. Each &quot;home.css&quot; file is responsible for the current folder and its subfolders.<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/types.sniff">types.sniff</a>&quot;: file types for resource sniffer<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/bookmark.html">bookmark.html</a>&quot;: bookmarks<br>
&quot;js.allow&quot;: 3rd-party resource white list. One domain per line.<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/quickstart.html">quickstart.html</a>&quot;: quick start icons on the home screen.<br>
&quot;url.deny&quot;: one giant regular expression for blocked urls (java grammar). &quot;#&quot; to comment and carriage return (CR or new line) is ignored.<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/colors.txt">colors.txt</a>&quot;: background colors<br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/sniff.log">sniff.log</a>&quot;: resource sniffing result<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/default.css">default.css</a>&quot;: <a href="../sitejs/index.html#">default CSS style for domains not defined in sitejs folder</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/history.rec">history.rec</a>&quot;: visiting history<br> &quot;<a href="file:///data/data/info.torapp.uweb/files/night.css">night.css</a>&quot;: <a href="../globalcss/index.html#">Night mode</a><br>
&quot;<a href="file:///data/data/info.torinfo.uweb/files/query.rec">query.rec</a>&quot;: query history</p> &quot;bookmarklet/videoplayer.js&quot;: fullscreen video player<br>
<p>&quot;shortcut/&quot;: dynamical shortcut, if not exist, then default to &quot;bookmark&quot;.</p> &quot;<a href="file:///data/data/info.torapp.uweb/files/help_en.html">help_en.html</a>&quot;: It is shown before the English manual when pressing the setting button.<br>
&quot;<a href="file:///data/data/info.torapp.uweb/files/help_zh.html">help_zh.html</a>&quot;: It is shown before the Chinese manual when pressing the setting button.<br>
&quot;<a href="file:///data/data/info.torapp.uweb/files/types.sniff">types.sniff</a>&quot;: file types for resource sniffer<br>
&quot;<a href="file:///data/data/info.torapp.uweb/files/js.allow">js.allow</a>&quot;: 3rd-party resource white list. One domain per line.<br>
&quot;<a href="file:///data/data/info.torapp.uweb/files/url.deny">url.deny</a>&quot;: one giant regular expression for blocked urls (java grammar). &quot;#&quot; to comment and carriage return (CR or new line) is ignored.<br>
&quot;<a href="file:///data/data/info.torapp.uweb/files/sniff.log">sniff.log</a>&quot;: resource sniffing result<br>
&quot;<a href="file:///data/data/info.torapp.uweb/files/history.rec">history.rec</a>&quot;: visiting history<br>
&quot;<a href="file:///data/data/info.torapp.uweb/files/query.rec">query.rec</a>&quot;: query history</p>
<p>&quot;<a href="file:///data/data/info.torapp.uweb/files/shortcut/">shortcut/</a>&quot;: dynamical shortcut, if not exist, then default to &quot;bookmark&quot;.</p>
</div> </div>
<p>Last Modified: 9 April 2025<br>
fix broken links<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

100
en/gesture/index.html Normal file
View file

@ -0,0 +1,100 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/gesture/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Gestures</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Gestures
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<p>Swipe down from the top to show the address bar; swipe up to the top to hide the address bar. Swipe down to the bottom to hide the toolbar with option &quot;swipe to hide tools&quot;; swipe on the bottom corners to show the toolbar.</p>
<p>Swipe left/right near the toolbar to switch window; fling left/right to switch to the last/first window.</p>
<p>Swiping on the top part of content window (near the top address bar by default) triggers corresponding link in the file &quot;default.gesture&quot;, which has the same format as <a href="../links/index.html#">default.link</a>.</p>
<p>The algorithm to match swiping gesture to a line in the file &quot;default.gesture&quot; is as follows:</p>
<ul>
<li>Divide the screen width to three parts evenly, assign each part with a number 0, 1, 2 respectively.</li>
<li>Assume &quot;s&quot; and &quot;e&quot; are the above defined numbers for the gesture start point and end point. Let &quot;linenumber = 3*s+e&quot; , if it is equal to 4 and the gesture's first direction is left, then change it to be 9.</li>
<li>For turning back and forth, add &quot;10&quot; each time.</li>
</ul>
<p>The final line number will match the corresponding line in &quot;default.gesture&quot;, 0 to the first line, ...</p>
<p>&quot;default.gesture2&quot; is for the right side gesturs and the algorithm is similar to &quot;default.gesture&quot;.</p>
<p>Example links:<br>
Toggle fullscreen::0003<br>
back:javascript:history.back()<br>
forward:javascript:history.forward()<br>
back2:javascript:history.go(-2)</p>
</div>
<p>Last Modified: 2 April 2024<br>
add js function in README<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

View file

@ -3,10 +3,11 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/globalcss/" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>CSS样式</title> <title>CSS styles</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +29,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a> <a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
@ -40,20 +41,53 @@
<br /> <br />
<div class="container"> <div class="container">
<h1 class="title">CSS样式 <h1 class="title">CSS styles
<br> <br>
<span class="subtitle"></span> <span class="subtitle"></span>
</h1> </h1>
<ul class="tags"> <ul class="tags">
</ul> </ul>
<p><a href="../index.html">Uweb browser</a> loads all &quot;.css&quot; files under the folder &quot;css&quot; as global css. Click the following links to install global css files:</p> <p><a href="../index.html#">Uweb browser</a> loads all &quot;.css&quot; files under the folder &quot;css&quot; as global css. Click the following links to install global css files:</p>
<p><a href="i:0hcss/clearfont.css:https://fastly.jsdelivr.net/gh/torappinfo/uwebzh/zh/searchurl/txt/clearfont.css">Clearing font settings</a></p> <p><a href="i:0hcss/clearfont.css:../../zh/searchurl/txt/clearfont.css">Clearing font settings</a></p>
<p>The file &quot;night.css&quot; is used as night mode, click the following links to install one:<br> <p>The file &quot;night.css&quot; is used as night mode, click the following links to install one:<br>
<a href="i:0hnight.css:https://fastly.jsdelivr.net/gh/torappinfo/uwebzh/zh/searchurl/txt/night.css">webview 81+ night mode</a><br> <a href="i:0hnight.css:../../zh/searchurl/txt/night.css">webview 81+ night mode</a><br>
<a href="i:0hnight.css:https://fastly.jsdelivr.net/gh/torappinfo/uwebzh/zh/searchurl/txt/night_old.css">webview 80- night mode</a></p> <a href="i:0hnight.css:../../zh/searchurl/txt/night_old.css">webview 80- night mode</a></p>
<h4 id="earliest-loaded-global-js">Earliest loaded global js</h4>
<p>The &quot;.js&quot; files under the folder &quot;css&quot; are loaded as earlier as possible on the page.</p>
<p>Click the following links to install early loaded global js:<br>
<a href="i:0hcss/nojscopy.js::document.addEventListener(%22copy%22,(e)=>{e.preventDefault()})">No webpage clipboard copy</a></p>
</div> </div>
<p>Last Modified: 13 October 2024<br>
add css/nojscopy.js to disable webpage clipboard copy<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

159
en/html5/index.html Normal file
View file

@ -0,0 +1,159 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/html5/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Html5 applications</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Html5 applications
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<h3 id="remotelocal-big-txthtmlmd-files-zstgzbr-compressed-optionally-as-search-engines-or-paged-reader">remote/local big txt/html/md files (.zst,.gz,.br compressed optionally) as search engines or paged reader</h3>
<p><code>i:0/js/reader.html:[remote url]#s=%s</code><br>
is the search engine url for remote/local file.</p>
<p><code>i:0/js/reader.html:[remote url]</code><br>
is the paged reader for big txt/html files.</p>
<p>Users can add a menu item by visiting <a href="../urls/index.html#">url services</a> and clicking the <code>Reader</code> link. After the menu item is installed and uweb restarts, long pressing any big txt/html/md link --&gt; command --&gt; Reader would load the big file in paged reader, long pressing button &quot;-&gt;&quot; on bottom toolbar --&gt; add as search engine --&gt; change the last part of url from &quot;#p=1&quot; to &quot;#s=%s&quot; and save the engine.</p>
<h3 id="html-as-data-cruncher-and-presenter-using-remote-url-as-data-with-i0-links">Html as data cruncher and presenter using remote url as data with <a href="../links/index.html#">i:0/ links</a></h3>
<p>The following link can be used to read [remote url] as huge text file, it shows only the first page. Pressing &quot;-&gt;&quot; on the bottom tool bar for next page:<br>
i:0/js/view.html:[remote url]#p=1</p>
<p>Multiple conversions could be appended to the html file. Ex:<br>
i:0m/js/view.html#/js/2lnk.js:[remote url]#p=1<br>
where &quot;/js/2lnk.js&quot; converts urls in the remote text file to clickable links.</p>
<p>Any html/js file could be referred with its full path, such as &quot;/sdcard/.../xx.js&quot; as long as uweb has read permission.</p>
<p>&quot;%1%&quot;, &quot;%2%&quot;, ... in the above html file will be replaced by the function body of the first, second, ... js file respectively. The js files themselves are regular js code ends with &quot;()&quot;, no end of line (\n) appended. A sample js file looks like &quot;((...args)=&gt;{})()&quot;, so the code itself can also be run independently as bookmarklet either without or <a href="../rjs/index.html#">with extra argument</a>.</p>
<h3 id="traditional-html5-apps">Traditional html5 apps</h3>
<p>This page is for <a href="../index.html#">uweb browser</a>.<br>
Click to install the following html5 apps:<br>
<a target="_self" href="i:0happ/txtview.html:../../zh/searchurl/txt/txtview.html">Huge markdown file viewer</a><br>
<a target="_self" href="i:0happ/mdkatex.html:../../zh/searchurl/txt/mdkatex.html">Huge markdown+katex file viewer (Tex formulas)</a><br>
<a target="_self" href="i:0happ/markdeep.html:../../zh/searchurl/txt/markdeep.html">Huge markdeep file viewer (markdown, latex, diagram,graphviz etc.)</a><br>
<a target="_self" href="i:0happ/plyr.html:../../zh/searchurl/txt/plyr.cfg">plyr video player</a><br>
<a target="_self" href="i:0happ/dplayer.html:../../zh/searchurl/txt/dplayer.html">dplayer video player</a><br>
<a target="_self" href="i:0happ/pdfviewer.html:../../zh/searchurl/txt/pdfviewer.html">pdf viewer</a><br>
<a target="_self" href="i:0happ/epub.html:../../zh/searchurl/txt/epub.html">epub reader (authorllili)</a><br>
<a target="_self" href="i:0happ/djvu.html:../../zh/searchurl/txt/djvu.html">djvu viewer</a></p>
<p>The corresponding menus can be installed with <a href="../urls/index.html#">url services</a>.</p>
<h4 id="features">Features</h4>
<p>The following mentioned subfolders locate in the configuration folder.</p>
<ul>
<li>
<p>The following html5 applications are allowed to read local files referred by &quot;https://l/appXXX/...&quot; where the &quot;/appXXX/&quot; part is the subfolder name that must begins with &quot;app&quot;. The below applications <span style="color:red">can auto choose any files as file objects</span>.</p>
<ul>
<li>Locating in a subfolder whose name begins with &quot;app&quot; (such as &quot;appPDF&quot;)</li>
<li>&quot;https://l/...&quot; applications.</li>
</ul>
</li>
<li>
<p><span style="color:red">All files under the subfolder &quot;app&quot; can be automatically choosed as file objects by any web page</span>.</p>
</li>
<li>
<p><span style="color:red">Local files (including binary files) can be processed by appending &quot;?app=[html5 app url]&quot; to the file urls.</span> Ex. &quot;file:///..../xx.md?app=https://...../app.html&quot; loads &quot;app.html&quot; first, then &quot;app.html&quot; processes the local file.</p>
</li>
</ul>
<p>With the first approach, the html5 application is installed locally and can read any file allowed by the OS; while in the second approach, the html5 application can be either local or remote, and only files under the subfolder &quot;app&quot; can be accessed; The third approach allows easy access of other external resources (ex. local media).</p>
<h4 id="open-local-files-with-html5-apps">Open local files with html5 apps</h4>
<p>Click to configure <a href="../filecap/index.html#">default.filecap</a> to open local files, and to open remote files with the option &quot;custom file handling&quot;:<br>
<a target="_self" href="i:0gdefault.filecap:../../zh/searchurl/txt/filecap.cfg">use pdf.js,djvu.js,epub.js, huge markdown viewer for local files</a></p>
<p>url examples are as follows:</p>
<ul>
<li>file:///data/user/0/info.torapp.uweb/files/app/pdfviewer.html?file=[path].pdf#page=[xxx]</li>
<li>file:///data/user/0/info.torapp.uweb/files/app/djvu.html?url=...xx.pdf#page=[xxx]</li>
<li>file:///data/user/0/info.torapp.uweb/files/app/txtview.html?url=[url]#page=[xxx]</li>
<li>file:///data/user/0/info.torapp.uweb/files/app/txtview.html?url=[url]#offset=[xxxx]&amp;[length]</li>
<li>file:///data/user/0/info.torapp.uweb/files/app/markdeep.html?url=[url]#page=[xxx]</li>
<li>file:///data/user/0/info.torapp.uweb/files/app/markdeep.html?url=[url]#offset=[xxxx]&amp;[length]</li>
</ul>
<p>Ex. &quot;#offset=10000&amp;500&quot; will retrieve 500 bytes from offset 10000. Click the right arrow button to next page in all above file viewers.</p>
<h4 id="configure-html5-app-subfolder-app-optional">Configure html5 app subfolder &quot;app&quot; (optional)</h4>
<p>By default, the subfolder &quot;app&quot; is created by clicking to install any of above html5 applications.</p>
<p>To make file management easier, users can symbolic link the subfolder &quot;app&quot; to any other locations as long as it is readable.</p>
<p>One way to configure &quot;app&quot; subfolder is as follows:</p>
<ul>
<li><a href="i:15d:text/plain:toybox mkdir -p /sdcard/Download/app;toybox ln -s /sdcard/Download/app 2>&1:">Click to copy the command to the address bar</a></li>
<li>Press the home screen button of uweb browser bottom toolbar, so the home screen appears.</li>
<li>If you want &quot;app&quot; to be locations other than &quot;/sdcard/Download/app&quot;, modify as you like.</li>
<li>Press &quot;enter&quot; on the address bar to execute the command.</li>
</ul>
<h4 id="mdict-dictionary-lookup-search-engines">mdict dictionary lookup search engines:</h4>
<p>Note: the following two mdict.html files are different.<br>
i:5ifile:///....../xxx.mdx,xxx.mdd?app=https://cdn.jsdelivr.net/gh/torappinfo/uweb/en/searchurl/mdict/mdict.html#word=%s</p>
<p>in which &quot;/.../xxx.mdx,xxx.mdd&quot; is the full path for the mdict dictionary files.</p>
<p>i:5ihttps://uwebzh.netlify.app/zh/searchurl/txt/mdict.html?file=mdict/xxx.mdx,mdict/xxx.mdd#word=%s</p>
<p>In the above mdict search engine string, the dictionary files (mdx, mdd) must locate in the &quot;app&quot; subfolder under the configuration folder. In above example, the files &quot;xxx.mdx&quot; and &quot;xxx.mdd&quot; locate in the folder &quot;.../app/mdict&quot;.</p>
<p>To make life easier, users can <a href="../acmd/index.html#">link the &quot;app&quot; subfolder</a> to any public accessible folder.</p>
<p>Use the mdx scanning <a href="../bookmark/index.html#">bookmark</a> to add mdict engines automatically, then cold start uweb browser to take effect.</p>
</div>
<p>Last Modified: 6 January 2026<br>
html5: paged reader/engine support<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

View file

@ -3,10 +3,11 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/icons/" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Toolbar customization</title> <title>Toolbar customization</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +29,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a> <a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
@ -49,11 +50,39 @@
</ul> </ul>
<p>If subfolder &quot;icon&quot; exists, then files named as &quot;0&quot;,&quot;1&quot;,&quot;2&quot;...<br> <p>If subfolder &quot;icon&quot; exists, then files named as &quot;0&quot;,&quot;1&quot;,&quot;2&quot;...<br>
are used for icons in the bottom toolbar. file &quot;0&quot; to replace the left arrow button, &quot;1&quot; for right arrow button, &quot;2&quot; for the setting button,&quot;3&quot; for the home screen button,...</p> are used for icons in the bottom toolbar. file &quot;0&quot; to replace the left arrow button, &quot;1&quot; for right arrow button, &quot;2&quot; for the setting button,&quot;3&quot; for the home screen button,...</p>
<p>If a new button is defined (file name &quot;20&quot; exists), uweb also supports VectorDrawable with &quot;android compiled XML&quot; format. All icon files must be all VectorDrawables or 此时所有图标文件必须都是compiled XML格式或都是普通的图像格式png,jpg,gif等。用户可将VectorDrawable XML文件放到安卓项目目录assets下面重新生成apk文件以后将apk文件解压即可得compiled XML格式图标文件。</p> <p>If a new button is defined (file name &quot;20&quot; exists), uweb also supports VectorDrawable with &quot;android compiled XML&quot; format. All icon files must be either all compiled VectorDrawables or common image formats.</p>
<p>用户可定义任意多个按钮(100个按钮毫无压力)其短按长按功能可在文件default.button及default.button2中定义格式与文件<a href="../links">default.link</a>完全相同,每行从最后一个按钮开始重定义功能。</p> <p>Note: The refresh and tab manager button can not be redefined.</p>
<p>注意:刷新按钮及窗口按钮图标暂时不能重定义。</p>
</div> </div>
<p>Last Modified: 2 April 2024<br>
add flg for not following sys night mode<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

View file

@ -1,13 +1,15 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<meta name="generator" content="Hugo 0.101.0" /> <meta name="generator" content="Hugo 0.152.2">
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/" />
<link rel="alternate" type="application/rss+xml" href="https://jamesfengcao.gitlab.io/uweb/en/index.xml" title="uweb browser: unlimited power">
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title></title> <title>uweb browser: unlimited power</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -29,7 +31,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a> <a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
@ -44,115 +46,230 @@
<ul class="posts"> <ul class="posts">
<li class="post"> <li class="post">
<a href="https://s1.asytech.cn/s/tQrgT5kBRg8Trry"> <a href="readme/index.html#">
<span>Download the uweb browser</span> <span>About uweb browser</span>
</a> </a>
</li> </li>
<li class="post"> <li class="post">
<a href="searchurl/search.html"> <a href="urls/index.html#">
<span>Search engines</span>
</a>
</li>
<li class="post">
<a href="searchurl/urls.html">
<span>Url services</span> <span>Url services</span>
</a> </a>
</li> </li>
<li class="post"> <li class="post">
<a href="sitemap/index.html"> <a href="search/index.html#">
<span>Site map</span> <span>Search engine query URLs</span>
</a> </a>
</li> </li>
<li class="post"> <li class="post">
<a href="filenames/index.html"> <a href="changelog/index.html#">
<span>Configuration folders/files</span> <span>Downloads</span>
</a> </a>
</li> </li>
<li class="post"> <li class="post">
<a href="links/index.html"> <a href="sitemap/index.html#">
<span>Configuration</span>
</a>
</li>
<li class="post">
<a href="cmds/index.html#">
<span>Commands</span>
</a>
</li>
<li class="post">
<a href="rjs/index.html#">
<span>Execute javascript codes</span>
</a>
</li>
<li class="post">
<a href="i:61:searchurl/func.html#">
<span>UI</span>
</a>
</li>
<li class="post">
<a href="html5/index.html#">
<span>Html5 applications</span>
</a>
</li>
<li class="post">
<a href="filemanager/index.html#">
<span>File manager</span>
</a>
</li>
<li class="post">
<a href="tips/index.html#">
<span>Tips</span>
</a>
</li>
<li class="post">
<a href="input/index.html#">
<span>Phrases and input method</span>
</a>
</li>
<li class="post">
<a href="longclick/index.html#">
<span>Context menu</span>
</a>
</li>
<li class="post">
<a href="globalcss/index.html#">
<span>CSS styles</span>
</a>
</li>
<li class="post">
<a href="textprocess/index.html#">
<span>Text selection/processing</span>
</a>
</li>
<li class="post">
<a href="links/index.html#">
<span>Links</span> <span>Links</span>
</a> </a>
</li> </li>
<li class="post"> <li class="post">
<a href="adblock/index.html"> <a href="tcron/index.html#">
<span>Cron</span>
</a>
</li>
<li class="post">
<a href="offlinecache/index.html#">
<span>Offline resources</span>
</a>
</li>
<li class="post">
<a href="redirect/index.html#">
<span>Resource redirection</span>
</a>
</li>
<li class="post">
<a href="adblock_domain/index.html#">
<span>Hosts files</span>
</a>
</li>
<li class="post">
<a href="sitejs/index.html#">
<span>JS/CSS/HTML/preprocessing for domains</span>
</a>
</li>
<li class="post">
<a href="bookmark/index.html#">
<span>Bookmarks</span>
</a>
</li>
<li class="post">
<a href="acmd/index.html#">
<span>Address bar command line</span>
</a>
</li>
<li class="post">
<a href="url2site/index.html#">
<span>Any url as website</span>
</a>
</li>
<li class="post">
<a href="filenames/index.html#">
<span>Configuration folders/files</span>
</a>
</li>
<li class="post">
<a href="adblock/index.html#">
<span>AD blocking</span> <span>AD blocking</span>
</a> </a>
</li> </li>
<li class="post"> <li class="post">
<a href="bookmarklet/index.html"> <a href="bookmarklet/index.html#">
<span>Bookmarklets</span> <span>Bookmarklets</span>
</a> </a>
</li> </li>
<li class="post"> <li class="post">
<a href="pccopy/index.html"> <a href="icons/index.html#">
<span>Text selection</span>
</a>
</li>
<li class="post">
<a href="globalcss/index.html">
<span>CSS样式</span>
</a>
</li>
<li class="post">
<a href="icons/index.html">
<span>Toolbar customization</span> <span>Toolbar customization</span>
</a> </a>
</li> </li>
<li class="post"> <li class="post">
<a href="longclick/index.html"> <a href="searchcat/index.html#">
<span>Long pressed link menu</span> <span>Search engine files</span>
</a> </a>
</li> </li>
<li class="post"> <li class="post">
<a href="filecap/index.html"> <a href="termux/index.html#">
<span>Termux</span>
</a>
</li>
<li class="post">
<a href="useragents/index.html#">
<span>User agents</span>
</a>
</li>
<li class="post">
<a href="tools/index.html#">
<span>Tools</span>
</a>
</li>
<li class="post">
<a href="filecap/index.html#">
<span>Custom file handling</span> <span>Custom file handling</span>
</a> </a>
</li> </li>
<li class="post"> <li class="post">
<a href="adblock_domain/index.html"> <a href="gesture/index.html#">
<span>Blocking domain trees</span> <span>Gestures</span>
</a>
</li>
<li class="post">
<a href="changelog/index.html">
<span>Change log</span>
</a>
</li>
<li class="post">
<a href="sitejs/index.html">
<span>Javascript and CSS for domains</span>
</a> </a>
</li> </li>
<li class="post"> <li class="post">
<a href="searchurl/rjs.html"> <a href="searchurl/webdav.html#">
<span>Javascript</span> <span>Webdav storage menu generator</span>
</a>
</li>
<li class="post">
<a href="searchurl/cmds.html">
<span>Commands</span>
</a> </a>
</li> </li>
</ul> </ul>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

File diff suppressed because one or more lines are too long

108
en/input/index.html Normal file
View file

@ -0,0 +1,108 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/input/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Phrases and input method</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Phrases and input method
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<h4 id="defaultinput">&quot;default.input&quot;</h4>
<p>Click the following links to install menus popped by long pressing the share button (with arrow-out-of-square as icon) on the bottom toolbar:<br>
<a href="i:0gdefault.input::@AddrBar%0A">Address Bar</a><br>
<a href="i:0gdefault.input::%20\n%0A">New line</a><br>
<a href="i:0gdefault.input::@^Z@%1A%0A">CTRL-Z: undo</a><br>
<a href="i:0gdefault.input::@^Y@%19%0A">CTRL-Y: redo</a></p>
<p>Long pressing the share button in <a href="../index.html#">uweb browser</a> will popup menus defined in file &quot;default.input&quot;, each line of which defines common phrase for user inputs. If the phrase begins with &quot;@xxxx@&quot;, then &quot;xxxx&quot; part is the alias for the rest part of the string. Alias could be used for non-printable phrases.</p>
<h4 id="long-text-can-be-kept-as-txt-file">Long text can be kept as txt file</h4>
<p>Click the following links to install menus displayed by long pressing the <a href="../links/index.html#">bookmark button</a> (with star as icon):<br>
<a href="i:0gdefault.link::Input::cinput%0A">Select utf8 text file as keyboard input</a></p>
<h4 id="address-bar">Address bar</h4>
<h5 id="address-bar-autocompletion-as-input-method-when-starting-with-space">Address bar autocompletion as input method when starting with space</h5>
<p>&quot;default.autoc&quot; or other .autoc files when <a href="../tips/index.html#">choosen</a> are loaded for address bar autocompletion. If the address bar text starts with space, the selected text is treated as user input for focused element in the visible tab.</p>
<p>Click the following links to append AI prompts:<br>
<a href="i:0gdefault.autoc:: \nFetch the data from all above URLs, %0A">Fetch the data from above URLs<a></p>
<p>More AI prompts, you could put them in the file &quot;default.autoc&quot; or other .autoc files:</p>
<ul>
<li><a href="https://word.studio/prompts/">word.studio</a></li>
</ul>
<h5 id="address-bar-as-part-of-query">Address bar as part of query</h5>
<p>When the input in main home screen starts with &quot;space+newline&quot;, the effective query is addressbar+input.</p>
<h5 id="address-bar-as-ime">Address bar as IME</h5>
<p>Action mode menu item &quot;⌨️&quot; for address bar selection makes the text user input for focused element in the visible tab.</p>
<p>Text processing commands or links can be installed as menus to process address bar text, thus makes address bar powerful IME.</p>
</div>
<p>Last Modified: 13 November 2025<br>
update search engines<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

View file

@ -3,10 +3,11 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/links/" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Links</title> <title>Links</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +29,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a> <a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
@ -47,29 +48,56 @@
<ul class="tags"> <ul class="tags">
</ul> </ul>
<p>Clicking the following hypertext will install menus for long pressing the bookmark button (with star as icon):<br> <h4 id="context-menu">Context menu</h4>
<a href="i:0gdefault.link::Certificate info:i:1b%0A">Certificate info</a></p> <p>The configuration file <code>image.link</code>, <code>download.link</code> and <code>context.link</code> define the default <code>command</code> submenu of the context menus when a url link is long pressed.</p>
<h5 id="context-menu-for-images">Context menu for images</h5>
<p>Click the following links to install <code>command</code> submenu for image's context menu:<br>
<a href="i:0gimage.link::google:https://www.google.com/searchbyimage?image_url=%25u0A">google image</a></p>
<p><a href="i:0gimage.link::tineye:https://tineye.com/search?url=%25u0A">tineye</a></p>
<p><a href="i:0gimage.link::yandex:https://yandex.com/images/search?family=yes&rpt=imageview&url=%25u0A">yandex image</a></p>
<h5 id="download-options-menu---command">Download options menu -&gt; <code>command</code></h5>
<p>Click the following links to install <code>command</code> submenu for <b>download options menu</b>:<br>
<a href="i:0gdownload.link::pager:i:0m/js/view.html:%25u#p=1%0A">huge txt pager</a></p>
<p><a href="i:0gdownload.link::pager_2lnk:i:0m/js/view.html#/js/2lnk.js:%25u#p=1%0A">pager with urls converted to links</a></p>
<p><a href="i:0gdownload.link::mdPager:i:0m/js/viewmd.html:%25u#p=1%0A">markdown pager</a></p>
<h4 id="link-menus-long-pressing-the-bookmark-button">Link menus (long pressing the bookmark button)</h4>
<p>Click the following links to install menus displayed by long pressing the bookmark button (with star as icon):<br>
<a href="i:0gdefault.link::ClearWeb::cclear%0A">Clear Web Storage, keeping cookies and cache</a></p>
<p><a href="i:0gdefault.link::Input::cinput%0A">Select utf8 text file as keyboard input</a></p>
<p><a href="i:0gdefault.link::wol::cwol %0A">Wake-on-LANneed to insert your network MAC address before &quot;%0A&quot;</a></p>
<p><a href="i:0gdefault.link::Capture::ccapture%0A">Capture long screenshot</a> (need <a href="i:61:../searchurl/func.html">long screenshot mode</a>)</p>
<p><a href="i:0gdefault.link:../searchurl/txt/link.cfg">Select All:CTRL-A/undo:CTRL-Z/Redo:CTRL-Y</a></p>
<p><a href="i:0gdefault.link::Extend cookies::0cc;Max-Age=315360000%0A">Extend site cookies to 10 years</a></p>
<p><a href="i:0gdefault.link::Clear cookies::0cc;Max-Age=0%0A">Clear site cookies</a></p>
<p><a href="i:0gdefault.link::vpn:i:1dandroid.net.vpn.SETTINGS:::%0A">VPN</a></p>
<p><a href="i:0gdefault.link::profile_config::cprofile . files .conf%0A">Switch configuration</a></p>
<p><a href="i:0gdefault.link::Wait msg:i:1w%0A">Wait for network msg</a></p>
<p><a href="i:0gdefault.link::Certificate info:i:1c%0A">Certificate info</a></p>
<p><a href="i:0gdefault.link::Backup2Box: {let path=`%f`;let iSlash=path.lastIndexOf('/',path.length-2);let f;if('/'!=path[path.length-1])f=path.substring(iSlash+1);else f=path.substring(iSlash+1,path.length-1);location.href='i:0e'+path+':https://dav.box.com/dav/'+f+'.tgz';}%0A">Backup to box.com</a></p>
<p><a href="i:0gdefault.link::restoreFromBox: {let path=`%f`;let iSlash=path.lastIndexOf('/',path.length-2);let f;if('/'!=path[path.length-1])f=path.substring(iSlash+1);else f=path.substring(iSlash+1,path.length-1);location.href='i:0dhttps://dav.box.com/dav/'+f+'.tgz';}%0A">Restore from box.com</a></p>
<p><a href="i:0gdefault.link::up2Box: {let path=`%f`;let iSlash=path.lastIndexOf('/',path.length-2);let f;if('/'!=path[path.length-1])f=path.substring(iSlash+1);else f=path.substring(iSlash+1,path.length-1)+'.tgz';location.href='i:0u'+path+':https://dav.box.com/dav/'+f;}%0A">upload to box.com</a></p>
<p><a href="../searchurl/webdav.html">More webdav link menu items</a></p>
<p><a href="i:0gdefault.link::web fullscreen: location.href='i:5fsetTimeout(()=>document.documentElement.requestFullscreen(),50);';%0A">Web fullscreen</a></p> <p><a href="i:0gdefault.link::web fullscreen: location.href='i:5fsetTimeout(()=>document.documentElement.requestFullscreen(),50);';%0A">Web fullscreen</a></p>
<p>Long pressing the bookmark button in <a href="../index.html">uweb browser</a> will popup menus defined in file &quot;default.link&quot;. The file format is as follows:<br> <h4 id="links">Links</h4>
[Menu name]:[url][space][javascript code]</p> <p>Long pressing the bookmark button in <a href="../index.html#">uweb browser</a> will popup menus defined in file <code>default.link</code>. The file format is as follows:<br>
<p>in which space and later parts are optional. url and later parts support <a href="../cmd/index.html">&quot;%u&quot;,&quot;%s&quot; etc.</a>. The javascript code will be executed after url is fully loaded.</p> [Menu name]:[one or more links delimited by &quot; \n &quot;]</p>
<p>and each link has the following format:<br>
[url][space][javascript code]</p>
<p>in which space and later parts are optional. url and later parts support <a href="../cmds/index.html#">&quot;%u&quot;,&quot;%s&quot; etc.</a>. The javascript code will be executed after url is fully loaded.</p>
<p>url supports all standard scheme (http(s):,javascript: etc.) and uweb internal schemes ( ':' as second character in the url ) and special links that begins with ':'.</p> <p>url supports all standard scheme (http(s):,javascript: etc.) and uweb internal schemes ( ':' as second character in the url ) and special links that begins with ':'.</p>
<p>uweb browser will handle local file urls (file:///) specially for some file types</p> <p>uweb browser will handle local file urls (file:///) specially for some file types</p>
<ul> <ul>
<li>.js file(same as <a href="../longclick/index.html">long pressing hypertext to execute js file</a>): If the &quot;.js&quot; file begins with &quot;//&quot;, then uweb browser will load the site following &quot;//&quot; and execute the following js code.</li> <li>.js file(same as <a href="../longclick/index.html#">long pressing hypertext to execute js file</a>): If the &quot;.js&quot; file begins with &quot;//&quot;, then uweb browser will load the site following &quot;//&quot; and execute the following js code.</li>
</ul> </ul>
<p><a href="../gesture/index.html">default.gesture</a> and default.button have the exactly same file format. &quot;.gesture&quot; files define gestures while &quot;.button&quot; define bottom toolbar button pressing actions from the last button to the first.</p> <p>If the above mentioned [links] part is malformated, then it is auto detected as html or text.</p>
<p><a href="../gesture/index.html#">default.gesture</a> and default.button have the exactly same file format. &quot;.gesture&quot; files define gestures while &quot;.button&quot; define bottom toolbar button pressing actions from the last button to the first.</p>
<p>proxy config:<br> <p>proxy config:<br>
httpproxy::010[proxy host]:[port]<br> httpproxy::010[proxy host]:[port]:[username]:[password]<br>
socks5::011[socks host]:[port]<br> socks5::011[socks host]:[port]:[username]:[password]<br>
noproxy::010:</p> noproxy::010:</p>
<h3 id="special-links-beginning-with-">special links beginning with ':'</h3> <h3 id="special-links-beginning-with-">special links beginning with ':'</h3>
<ul> <ul>
<li> <li>
<p>:0000<br>
Extend cookie expiracy to 70 years, may be denied by server.</p>
</li>
<li>
<p>:0003<br> <p>:0003<br>
Toggle fullscreen mode</p> Toggle fullscreen mode</p>
</li> </li>
@ -82,26 +110,76 @@ Rotate the screen</p>
Scan the fileurl and add it to media storage</p> Scan the fileurl and add it to media storage</p>
</li> </li>
<li> <li>
<p>:002[url]<br> <p>:010[proxy host]:[port]:[username]:[password]<br>
Show the secure cookie</p> Config http proxy, &quot;:010:&quot; to disable any proxy.<br>
&quot;:[username]:[password]&quot; is optional.</p>
</li> </li>
<li> <li>
<p>:010[proxy host]:[port]<br> <p>:011[socks host]:[port]:[username]:[password]<br>
Config http proxy, &quot;:010:&quot; to disable any proxy.</p> Socks proxy, &quot;:[username]:[password]&quot; is optional.</p>
</li> </li>
<li> <li>
<p>:011[socks host]:[port]<br> <p>:0cc[url1]:[url2][:;[cookie attributes]]<br>
Socks proxy</p> cookie copy from url1 to url2, the last part &quot;[:;[cookie attributes]]&quot; is optionable.</p>
</li>
</ul>
<h4 id="commands">commands</h4>
<ul>
<li>
<p>:![command line]<br>
The command line could be a &quot;.js&quot;, &quot;.sh&quot; or other executable with arguments. Ex. &quot;:!s g keyword&quot; could invoke &quot;s.js&quot; executable with the whole string as arguments (&quot;s.sh&quot; or &quot;s&quot; if file exists, here &quot;g&quot; as google search engine); &quot;:! g keyword&quot; would invoke the file &quot;.js&quot; or &quot;.sh&quot; as executable.</p>
<p>For regular (non-js) executables, the standard output of the command line will be treated as lines of web urls.</p>
<p><a href="i:0hs.sh:../searchurl/txt/web.sh">Click to install the example file &quot;s.sh&quot;</a><br>
<a href="i:0h.js:../searchurl/txt/web.js">Click to install the example file &quot;.js&quot;</a></p>
</li>
<li>
<p>:c[command]</p>
<ul>
<li>close<br>
&quot;:cclose&quot; to close the current window/tab.</li>
<li>input [path]<br>
&quot;:cinput&quot; to select utf8 file as keyboard input</li>
<li>profile [parent folder] [file/folder] [optional ID]<br>
Ex. &quot;:cprofile . files&quot; to switch configurations</li>
<li>set [key] [value]<br>
[key] could be one of the followings:
<ul>
<li>redirecturl</li>
</ul>
</li>
<li>wol [machine address]<br>
&quot;:cwol&quot; for wake-on-LAN.</li>
</ul>
</li>
<li>
<p>:p [width in milliInch]x[height] [top margin]:[right margin]:[bottom margin]:[left margin]<br>
Generate/Print PDF file in the &quot;/sdcard/Download&quot; folder, all units are milliinch.<br>
Ex. &quot;:p x&quot; or &quot;:px&quot; for screen width and infinite height (as long vector screenshot).<br>
&quot;:p x[height]&quot; or &quot;:px[height]&quot; for screen width.</p>
</li> </li>
</ul> </ul>
<h3 id="i-internal-links">&quot;i:&quot; internal links:</h3> <h3 id="i-internal-links">&quot;i:&quot; internal links:</h3>
<ul> <ul>
<li> <li>
<p>i:0m[bookmarklet index|prefix|c[cssFlag]]:[url]<br> <p>i:0UA[d][ExtraUseragent]:[url]<br>
Visiting url and execute the uweb browser internal bookmarklet, [bookmarklet index] must have at least two digits. For example, &quot;00&quot; as the first local bookmarklet; &quot;01&quot; as the first remote script; then &quot;02&quot; as the second local bookmarklet, ...</p> Open [url] with specified useragent appended by [ExtraUseragent]. &quot;[d]&quot; is optional single digit.</p>
</li>
<li>
<p>i:0b[path]:[url]<br>
Extract remote content (tar/tgz/zip) under the folder [path]. If [path] ends with &quot;/&quot;, then put unzipped file under the folder &quot;[path]/[file name stem]&quot; (for zipped files only, not for tar/tgz).</p>
</li>
<li>
<p>i:0m[-|1-9][bookmarklet index|prefix|?postfix|/.../localfile|H[headers]|c[cssFlag]]:[url]<br>
Visiting url and execute the uweb browser internal bookmarklet that keeps valid for all urls under the parent path of [url].</p>
<ul> <ul>
<li>[-|1-9] is optional single character. '-' to limit bookmarklet work only for urls with same path (could be different query strings). The digit is uplevel, 1 to make bookmarklet valid for parent path of [url].</li>
<li>[bookmarklet index] must start with two digits optionally followed by bookmarklet function argument. They are used as index of bootmarklet. For example, &quot;00&quot; as the first local bookmarklet; &quot;01&quot; as the first remote script; then &quot;02&quot; as the second local bookmarklet, ...</li>
<li>c[cssFlag]: For example, &quot;c12&quot; will apply the third and fourth global CSS (12=2^2+2^3).</li> <li>c[cssFlag]: For example, &quot;c12&quot; will apply the third and fourth global CSS (12=2^2+2^3).</li>
<li>All other cases will be treated as prefix, the real visited url is &quot;[prefix]+url&quot;.</li> <li>H[headers]: Ex. &quot;HX-Forwarded-For;8.8.8.8&quot; adds extra http request header &quot;X-Forwarded-For:8.8.8.8&quot;.</li>
<li>[?postfix]: the real visited url is &quot;[url]+[?postfix]&quot;.</li>
<li>[/.../localfile]: load the local html/js file that processes [url]. The first character of the local html file must be &quot;&lt;&quot;. The [localfile] could be optionally ended with url hash part as js function argument.</li>
<li>All other cases will be treated as [prefix], the real visited url is &quot;[prefix]+[url]&quot;.</li>
<li>Since <a href="../rjs/index.html#">activated scripts</a> use internal mechanism of &quot;i:0m&quot; urls, the script itself cannot have 'H', '?' as its very first character.</li>
</ul> </ul>
</li> </li>
<li> <li>
@ -123,18 +201,26 @@ Read partial data from url.<br>
Append [string] to the address bar text.</p> Append [string] to the address bar text.</p>
</li> </li>
<li> <li>
<p>i:1b<br> <p>i:1c<br>
Show web certificate.</p> Show web certificate.</p>
</li> </li>
<li> <li>
<p>i:1c<br> <p>i:1d<action>:<type>:<Category>:<data><br>
Launch app for specific <action>.</p>
</li>
<li>
<p>i:1w<br>
Wait to receive url from the network and open the url.</p> Wait to receive url from the network and open the url.</p>
</li> </li>
<li> <li>
<p>i:1c1<br> <p>i:1w1<br>
Wait to receive url from the network and open the url (not showing ip)</p> Wait to receive url from the network and open the url (not showing ip)</p>
</li> </li>
<li> <li>
<p>i:1e<br>
Open file manager for removable SDCARD download folder</p>
</li>
<li>
<p>i:50[path]:[string]<br> <p>i:50[path]:[string]<br>
Save [string] as file</p> Save [string] as file</p>
</li> </li>
@ -160,7 +246,8 @@ Save as link.</p>
</li> </li>
<li> <li>
<p>i:56[string]<br> <p>i:56[string]<br>
Use [string] as user input on web page.</p> Use [string] as user input on web page.<br>
The string can have any character such as ascii code 0-26, where code 0 means clear, and code 1-26 are from ctrl-A to ctrl-Z as shortcut keys. (to type &quot;Ctrl-A&quot; into a text file, use &quot;Ctrl-Q Ctrl-A&quot; with emacs or &quot;Ctrl-V Ctrl-A&quot; with vim)</p>
</li> </li>
<li> <li>
<p>i:57[jscode]<br> <p>i:57[jscode]<br>
@ -171,10 +258,6 @@ execute [jscode], even when js is disabled for the web page.</p>
Save to the desktop.</p> Save to the desktop.</p>
</li> </li>
<li> <li>
<p>i:59[filename]<br>
Send file content to network.</p>
</li>
<li>
<p>i:5a[filename]<br> <p>i:5a[filename]<br>
Receive content from network to the file.</p> Receive content from network to the file.</p>
</li> </li>
@ -183,10 +266,6 @@ Receive content from network to the file.</p>
Copy [string] to the clipboard.</p> Copy [string] to the clipboard.</p>
</li> </li>
<li> <li>
<p>i:5c[url]<br>
Change auto page turning internal url to be [url].</p>
</li>
<li>
<p>i:5d[file url]<br> <p>i:5d[file url]<br>
Open the file url compatible to other browsers.</p> Open the file url compatible to other browsers.</p>
</li> </li>
@ -199,20 +278,25 @@ TTS</p>
play video fullscreen. if videourl is empty, then make following requestFullscreen() work.</p> play video fullscreen. if videourl is empty, then make following requestFullscreen() work.</p>
</li> </li>
<li> <li>
<p>i:5g[videourl]<br> <p>i:5h[?postfix:|/regex/replacement:|encoding:][url]<br>
play video in external player</p> force html for [url] visiting</p>
</li> <ul>
<li> <li>[?postfix:] : the real url visited is &quot;[url]+[?postfix]&quot;</li>
<p>i:5h[url]<br> <li>[/regex/replacement:]: execute regular expression replacement for the &quot;[url]&quot;, then visit the resulting url.</li>
force html for url</p> <li>[encoding:]: force web page encoding.</li>
</ul>
</li> </li>
<li> <li>
<p>i:5i[url]<br> <p>i:5i[url]<br>
Use the existing tab for the url to jump to a different anchor.</p> Use the existing tab for the url with possible different url hash part.</p>
</li> </li>
<li> <li>
<p>i:5j[string]<br> <p>i:5j[string]<br>
Send string to network</p> if [string] is file url, then send the file/folder to network, otherwise send [string] to network.</p>
</li>
<li>
<p>i:5p[videourl]<br>
play video in external player</p>
</li> </li>
<li> <li>
<p>i:60[path]:[url]<br> <p>i:60[path]:[url]<br>
@ -227,12 +311,65 @@ Evaluate the [js code] and save the returned string to file.</p>
Visiting url and execute the bookmarklet. Only uweb predefined local bookmarlets are allowed.</p> Visiting url and execute the bookmarklet. Only uweb predefined local bookmarlets are allowed.</p>
</li> </li>
<li> <li>
<p>i:6i[js file path relative to configuration folder]:[url]<br>
Similar to i:5i, except executing the js file after possible url hash change.</p>
</li>
<li>
<p>i:70[url]:[auto page turning url]<br> <p>i:70[url]:[auto page turning url]<br>
Visiting [url], but use the second url as auto paging url.</p> Visiting [url], but use the second url as auto paging url.</p>
</li> </li>
<li>
<p>i:8d[url]<br>
Force downloading [url]</p>
</li>
<li>
<p>i:8l[filename]<br>
Loading configuration [filename]. Ex. &quot;i:8lconfig.html&quot; to reload config.html.</p>
</li>
<li>
<p>i:92[http request headers separated by ';']:[url]<br>
The &quot;Host&quot; Header (fake header, different from the standard) must be the first header.<br>
Ex. i:92Host;209.216.230.240:https://news.ycombinator.com<br>
use &quot;i:0mi:92Host;209.216.230.240::https://news.ycombinator.com&quot; to visit the site with specified IP address.</p>
</li>
<li>
<p>i:b1[internal urls or javascript separated by &quot;%0A&quot;]<br>
Bundle of internal urls, if it is an &quot;i:0&quot; url, then it should have the following format:<br>
[title]%0A[msg]%0A[optional callback url%0A][i:0url].</p>
</li>
</ul> </ul>
</div> </div>
<p>Last Modified: 8 December 2025<br>
use ` for terms<br>
<pre>i:56 urls support CTRL_A to CTRL-Z
</pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

View file

@ -3,10 +3,11 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/longclick/" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Long pressed link menu</title> <title>Context menu</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +29,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a> <a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
@ -40,28 +41,64 @@
<br /> <br />
<div class="container"> <div class="container">
<h1 class="title">Long pressed link menu <h1 class="title">Context menu
<br> <br>
<span class="subtitle"></span> <span class="subtitle"></span>
</h1> </h1>
<ul class="tags"> <ul class="tags">
<li><a href="../tags/javascript">javascript</a> </li> <li><a href="../tags/javascript/index.html#">javascript</a> </li>
</ul> </ul>
<h4 id="to-run-commands">To run commands</h4> <h4 id="the-command-submenus">The &quot;command&quot; submenus</h4>
<p>Each line of file &quot;<a href="file:///data/data/info.torinfo.uweb/files/default.longclick">default.longclick</a>&quot; has the following format: (same as <a href="../searchurl/cmds.html">default.cmds</a>)<br> <ul>
<li>File &quot;<a href="../links/index.html#">image.link</a>&quot;: defines &quot;command&quot; submenus of the context menu for images.</li>
<li>File &quot;<a href="../links/index.html#">download.link</a>&quot;: &quot;command&quot; submenus for download options menu.</li>
<li>File &quot;context.link&quot;: &quot;command&quot; submenus in all other cases.</li>
</ul>
<p>The &quot;command&quot; submenus can be toggled with <a href="i:61:../searchurl/func.html">UI options</a>. The &quot;command&quot; submenus are default ( service urls or image.link or download.link), links, commands or service urls (default.urls when both link and command options are ticked).</p>
<h4 id="to-run-commands">To run commands</h4>
<p>Each line of file &quot;<a href="file:///data/data/info.torapp.uweb/files/default.longclick">default.longclick</a>&quot; has the following format: (same as <a href="../cmds/index.html#">default.cmds</a>)<br>
[Name]:[mimetype]:[command line]<br> [Name]:[mimetype]:[command line]<br>
in which [command line] can have <a href="../searchurl/cmds.html">&quot;%c&quot; (cookie), &quot;%u&quot; (current url), &quot;%t&quot; (title)</a> etc.</p> in which [command line] can have <a href="../cmds/index.html#">&quot;%c&quot; (cookie), &quot;%u&quot; (current url), &quot;%t&quot; (title)</a> etc.</p>
<h4 id="to-visit-url-and-load-javascript-file">To visit url and load javascript file</h4> <h4 id="to-visit-url-and-load-javascript-file">To visit url and load javascript file</h4>
<p>All &quot;.js&quot; files under the folder &quot;<a href="file:///data/data/info.torinfo.uweb/files/longclick/">longclick</a>&quot; are part of the popup menu.<br> <p>All &quot;.js&quot; files under the folder &quot;<a href="file:///data/data/info.torapp.uweb/files/longclick/">longclick</a>&quot; are part of the popup menu.<br>
These javascript files are in the following format:</p> These javascript files are in the following format:</p>
<ul> <ul>
<li>The very first line can begin with &quot;//&quot; followed by website url that can have <a href="../searchurl/cmds.html">&quot;%u&quot; (current url), &quot;%t&quot; (title)</a> etc. included. In this case, the website is visited, then the javascript file is loaded on the new loaded site.</li> <li>The very first line can begin with &quot;//&quot; followed by website url that can have <a href="../cmds/index.html#">&quot;%u&quot; (current url), &quot;%t&quot; (title)</a> etc. included. In this case, the website is visited, then the javascript file is loaded on the new loaded site.</li>
<li>In the &quot;.js&quot; file, variable &quot;arguments&quot; can be used to get parameters. in which arguments[1] is the long-pressed link url, argument[2] is the text description and arguments[0] is the &quot;.js&quot; file name.</li> <li>In the &quot;.js&quot; file, variable &quot;arguments&quot; can be used to get parameters. in which arguments[1] is the long-pressed link url, argument[2] is the text description and arguments[0] is the &quot;.js&quot; file name.</li>
</ul> </ul>
</div> </div>
<p>Last Modified: 13 October 2025<br>
enable address bar as IME<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

64
en/mirrors.md Normal file
View file

@ -0,0 +1,64 @@
<style>a+br{display:none;}</style>
#### Mirrors (for version 1040+)
[gitee](https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html#)
[gitea](https://gitea.com/torappinfo/uweb/raw/branch/master/redirect.html#)
[tngl](https://tangled.org/@uweb.tngl.sh/uweb/raw/master/redirect.html#)
[notabug](https://notabug.org/torappinfo/uweb/raw/master/redirect.html#)
[launchpad](https://git.launchpad.net/uweb/plain/redirect.html#)
[framagit](https://framagit.org/torappinfo/uweb/-/raw/master/redirect.html#)
[disroot](https://git.disroot.org/torappinfo/uweb/raw/branch/master/redirect.html#)
[gitdab](https://gitdab.com/jamesfengcao/uweb/raw/branch/master/redirect.html#)
[pagure](https://pagure.io/uweb/raw/master/f/redirect.html#)
[bitbucket](https://bitbucket.org/torappinfo/torappinfo.bitbucket.io/raw/master/redirect.html#)
[jsdelivr](https://fastly.jsdelivr.net/gh/torappinfo/uweb/redirect.html#)
[dagshub](https://dagshub.com/torappinfo/uweb/raw/master/redirect.html#)
[gitgud](https://gitgud.io/jamesfengcao/uweb/-/raw/master/redirect.html#)
[gitly](https://gitly.org/jamesfengcao/uweb/raw/master/redirect.html#)
[gitnet](https://gitnet.fr/jamesfengcao/uweb/raw/branch/master/redirect.html#)
[tilde](https://tildegit.org/jamesfengcao/uweb/raw/branch/master/redirect.html#)
[antopie](https://code.antopie.org/jamesfengcao/uweb/raw/branch/master/redirect.html#)
[bgithub](https://bgithub.xyz/torappinfo/uweb/raw/master/redirect.html#)
#### Mirrors (for all versions)
<span>
<a href="i:0mi:5h:https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html">1</a>
<a href="i:0m?:https://gitea.com/torappinfo/uweb/raw/branch/master/redirect.html">5</a>
<a href="i:0mi:5h?format=raw::https://sourceforge.net/p/uwebbrowser/code/ci/master/tree/redirect.html">6</a>
<a href="i:0mi:5h?format=raw::https://rocketgit.com/user/torappinfo/uweb/source/tree/branch/master/blob_download/redirect.html">7</a>
<a href="i:0m?:https://notabug.org/torappinfo/uweb/raw/master/redirect.html">8</a>
<a href="i:0mi:5h:https://git.launchpad.net/uweb/plain/redirect.html">9</a>
<a href="i:0m?:https://framagit.org/torappinfo/uweb/-/raw/master/redirect.html">10</a>
<a href="i:0m?:https://git.disroot.org/torappinfo/uweb/raw/branch/master/redirect.html">13</a>
<a href="i:0m?:https://gitdab.com/jamesfengcao/uweb/raw/branch/master/redirect.html">14</a>
<a href="i:0mi:5h/xxxx/?path=::https://dev.azure.com/jamesfengcao/1d8bf6c7-7c24-4441-bc5e-9709dcaf37fc/_apis/git/repositories/2a588d9b-f25a-46c0-bb3b-f685c635fcf8/itemsxxxx/redirect.html">15</a>
<a href="i:0mi:5h:https://pagure.io/uweb/raw/master/f/redirect.html">16</a>
<a href="i:0m?:https://bitbucket.org/torappinfo/torappinfo.bitbucket.io/raw/master/redirect.html">17</a>
<a href="i:0mi:5h:https://fastly.jsdelivr.net/gh/torappinfo/uweb/redirect.html">18</a>
<a href="i:0m?:https://dagshub.com/torappinfo/uweb/raw/master/redirect.html">19</a>
<a href="i:0mi:5h:https://gitgud.io/jamesfengcao/uweb/-/raw/master/redirect.html">20</a>
<a href="i:0m?:https://gitly.org/jamesfengcao/uweb/raw/master/redirect.html">gitly</a>
<a href="i:0m?:https://gitnet.fr/jamesfengcao/uweb/raw/branch/master/redirect.html">gitnet</a>
<a href="i:0m?:https://tildegit.org/jamesfengcao/uweb/raw/branch/master/redirect.html">tilde</a>
<a href="i:0m?:https://code.antopie.org/jamesfengcao/uweb/raw/branch/master/redirect.html">antopie</a>
</span>
#### Repositories
[gitlab](https://gitlab.com/jamesfengcao/uweb)
[sourceforge](https://sourceforge.net/p/uwebbrowser)
[github](https://github.com/torappinfo/uweb)
[bitbucket](https://bitbucket.org/torappinfo/torappinfo.bitbucket.io)
[codeberg](https://codeberg.org/jamesfengcao/pages/src/branch/master/README.md)
[gitee](https://gitee.com/jamesfengcao/uweb)
[gitlink](https://www.gitlink.org.cn/jamesfengcao/uweb)
[gitgud](https://gitgud.io/jamesfengcao/uweb)
[disroot](https://git.disroot.org/torappinfo/uweb/src/branch/master/README.md)
[gitea](https://gitea.com/torappinfo/uweb/src/branch/master/README.md)
[notabug](https://notabug.org/torappinfo/uweb/src/master/README.md)
[framagit](https://framagit.org/torappinfo/uweb)
[gitdab](https://gitdab.com/jamesfengcao/uweb/src/branch/master/README.md)
[pagure](https://pagure.io/uweb/blob/master/f/README.md)
[dagshub](https://dagshub.com/torappinfo/uweb/src/master/README.md)
[gitnet](https://gitnet.fr/jamesfengcao/uweb/src/branch/master/README.md)
[tilde](https://tildegit.org/jamesfengcao/uweb/src/branch/master/README.md)
[antopie](https://code.antopie.org/jamesfengcao/uweb/src/master/README.md)
[tngl](https://tangled.org/@uweb.tngl.sh/uweb/blob/master/README.md)

142
en/mirrors/index.html Normal file
View file

@ -0,0 +1,142 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/mirrors/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title></title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<style>a+br{display:none;}</style>
<h4 id="mirrors-for-version-1040">Mirrors (for version 1040+)</h4>
<p><a href="https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html#">gitee</a><br>
<a href="https://gitea.com/torappinfo/uweb/raw/branch/master/redirect.html#">gitea</a><br>
<a href="https://tangled.org/@uweb.tngl.sh/uweb/raw/master/redirect.html#">tngl</a><br>
<a href="https://notabug.org/torappinfo/uweb/raw/master/redirect.html#">notabug</a><br>
<a href="https://git.launchpad.net/uweb/plain/redirect.html#">launchpad</a><br>
<a href="https://framagit.org/torappinfo/uweb/-/raw/master/redirect.html#">framagit</a><br>
<a href="https://git.disroot.org/torappinfo/uweb/raw/branch/master/redirect.html#">disroot</a><br>
<a href="https://gitdab.com/jamesfengcao/uweb/raw/branch/master/redirect.html#">gitdab</a><br>
<a href="https://pagure.io/uweb/raw/master/f/redirect.html#">pagure</a><br>
<a href="https://bitbucket.org/torappinfo/torappinfo.bitbucket.io/raw/master/redirect.html#">bitbucket</a><br>
<a href="https://fastly.jsdelivr.net/gh/torappinfo/uweb/redirect.html#">jsdelivr</a><br>
<a href="https://dagshub.com/torappinfo/uweb/raw/master/redirect.html#">dagshub</a><br>
<a href="https://gitgud.io/jamesfengcao/uweb/-/raw/master/redirect.html#">gitgud</a><br>
<a href="https://gitly.org/jamesfengcao/uweb/raw/master/redirect.html#">gitly</a><br>
<a href="https://gitnet.fr/jamesfengcao/uweb/raw/branch/master/redirect.html#">gitnet</a><br>
<a href="https://tildegit.org/jamesfengcao/uweb/raw/branch/master/redirect.html#">tilde</a><br>
<a href="https://code.antopie.org/jamesfengcao/uweb/raw/branch/master/redirect.html#">antopie</a><br>
<a href="https://bgithub.xyz/torappinfo/uweb/raw/master/redirect.html#">bgithub</a></p>
<h4 id="mirrors-for-all-versions">Mirrors (for all versions)</h4>
<span>
<a href="i:0mi:5h:https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html">1</a>
<a href="i:0m?:https://gitea.com/torappinfo/uweb/raw/branch/master/redirect.html">5</a>
<a href="i:0mi:5h?format=raw::https://sourceforge.net/p/uwebbrowser/code/ci/master/tree/redirect.html">6</a>
<a href="i:0mi:5h?format=raw::https://rocketgit.com/user/torappinfo/uweb/source/tree/branch/master/blob_download/redirect.html">7</a>
<a href="i:0m?:https://notabug.org/torappinfo/uweb/raw/master/redirect.html">8</a>
<a href="i:0mi:5h:https://git.launchpad.net/uweb/plain/redirect.html">9</a>
<a href="i:0m?:https://framagit.org/torappinfo/uweb/-/raw/master/redirect.html">10</a>
<a href="i:0m?:https://git.disroot.org/torappinfo/uweb/raw/branch/master/redirect.html">13</a>
<a href="i:0m?:https://gitdab.com/jamesfengcao/uweb/raw/branch/master/redirect.html">14</a>
<a href="i:0mi:5h/xxxx/?path=::https://dev.azure.com/jamesfengcao/1d8bf6c7-7c24-4441-bc5e-9709dcaf37fc/_apis/git/repositories/2a588d9b-f25a-46c0-bb3b-f685c635fcf8/itemsxxxx/redirect.html">15</a>
<a href="i:0mi:5h:https://pagure.io/uweb/raw/master/f/redirect.html">16</a>
<a href="i:0m?:https://bitbucket.org/torappinfo/torappinfo.bitbucket.io/raw/master/redirect.html">17</a>
<a href="i:0mi:5h:https://fastly.jsdelivr.net/gh/torappinfo/uweb/redirect.html">18</a>
<a href="i:0m?:https://dagshub.com/torappinfo/uweb/raw/master/redirect.html">19</a>
<a href="i:0mi:5h:https://gitgud.io/jamesfengcao/uweb/-/raw/master/redirect.html">20</a>
<a href="i:0m?:https://gitly.org/jamesfengcao/uweb/raw/master/redirect.html">gitly</a>
<a href="i:0m?:https://gitnet.fr/jamesfengcao/uweb/raw/branch/master/redirect.html">gitnet</a>
<a href="i:0m?:https://tildegit.org/jamesfengcao/uweb/raw/branch/master/redirect.html">tilde</a>
<a href="i:0m?:https://code.antopie.org/jamesfengcao/uweb/raw/branch/master/redirect.html">antopie</a>
</span>
<h4 id="repositories">Repositories</h4>
<p><a href="https://gitlab.com/jamesfengcao/uweb">gitlab</a><br>
<a href="https://sourceforge.net/p/uwebbrowser">sourceforge</a><br>
<a href="https://github.com/torappinfo/uweb">github</a><br>
<a href="https://bitbucket.org/torappinfo/torappinfo.bitbucket.io">bitbucket</a><br>
<a href="https://codeberg.org/jamesfengcao/pages/src/branch/master/README.md">codeberg</a><br>
<a href="https://gitee.com/jamesfengcao/uweb">gitee</a><br>
<a href="https://www.gitlink.org.cn/jamesfengcao/uweb">gitlink</a><br>
<a href="https://gitgud.io/jamesfengcao/uweb">gitgud</a><br>
<a href="https://git.disroot.org/torappinfo/uweb/src/branch/master/README.md">disroot</a><br>
<a href="https://gitea.com/torappinfo/uweb/src/branch/master/README.md">gitea</a><br>
<a href="https://notabug.org/torappinfo/uweb/src/master/README.md">notabug</a><br>
<a href="https://framagit.org/torappinfo/uweb">framagit</a><br>
<a href="https://gitdab.com/jamesfengcao/uweb/src/branch/master/README.md">gitdab</a><br>
<a href="https://pagure.io/uweb/blob/master/f/README.md">pagure</a><br>
<a href="https://dagshub.com/torappinfo/uweb/src/master/README.md">dagshub</a><br>
<a href="https://gitnet.fr/jamesfengcao/uweb/src/branch/master/README.md">gitnet</a><br>
<a href="https://tildegit.org/jamesfengcao/uweb/src/branch/master/README.md">tilde</a><br>
<a href="https://code.antopie.org/jamesfengcao/uweb/src/master/README.md">antopie</a><br>
<a href="https://tangled.org/@uweb.tngl.sh/uweb/blob/master/README.md">tngl</a></p>
</div>
<p>Last Modified: 12 November 2025<br>
add tangled<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

View file

@ -0,0 +1,97 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/offlinecache/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Offline resources</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Offline resources
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<p>Offline resources locate in the folder &quot;sitecache&quot;. With the option &quot;use offline resources&quot; enabled, the corresponding files in &quot;sitecache/[domain name]/[full path including filename, the url path part]&quot; are loaded first before reaching the network.</p>
<h4 id="serverless-local-sites">Serverless local sites</h4>
<p><a href="i:01Extract webapp:i:0bsitecache/local/:">Click to install url service that extracts web apps to the folder &quot;sitecache/local/&quot;</a>: support web extensions (.crx for chrome &amp; .xpi for firefox).</p>
<p>Any folder under &quot;sitecache&quot; can be visited as a local site. Urls with search queries can be dynamically processed by the js/wasm code in the local file.</p>
<p>PWAs (Progresssive Web Applications) and some web extensions (.crx for chrome &amp; .xpi for firefox) are just packaged websites. Ex. the &quot;kiwix&quot; extension can be extracted to the folder &quot;sitecache/local/kiwix&quot;<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, then the kiwix extension can be accessed via url &quot;https://local/kiwix/www/index.html#&quot; in the browser.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>the folder name &quot;local&quot; is used as the domain name in the url.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
</div>
<p>Last Modified: 8 April 2024<br>
fix typos<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

View file

@ -1,93 +0,0 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" />
<title>Text selection</title>
<script type="text/javascript">
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Text selection
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
<li><a href="../tags/termux">termux</a> </li>
<li><a href="../tags/ssh">ssh</a> </li>
<li><a href="../tags/PC">PC</a> </li>
<li><a href="../tags/clipboard">clipboard</a> </li>
<li><a href="../tags/Windows">Windows</a> </li>
</ul>
<p>Click the following links to install menus for long pressing the button &quot;link&quot;:<br>
<a href="i:0gdefault.select::google Translate:/uweb:printf 'https://translate.google.com/?sl=auto&tl=en&op=translate&text=';cat|tr ' ' '%2B'%0A">google Translate</a></p>
<p><a href="i:0gdefault.select::bing Translate:/uweb:printf 'https://cn.bing.com/translator/?from=&to=en&text=';cat|tr ' ' '%2B'%0A">bing translate</a></p>
<p><a href="i:0gdefault.select::deepL:/uweb:print 'https://www.deepl.com/translator {function tE(el,t){var e=new Event(t);el.dispatchEvent(e);}let s=document.querySelector(%22textarea%22);s.value=%60';cat;print '%60;tE(s,%22change%22)}'%0A">deepL</a></p>
<p>The file &quot;default.select&quot; defines menus for selected text. If no text is selected, the menu item operates on the whole page. Each line of the file has the following format:<br>
[Name]:[mimetype]:[command line]</p>
<p>[mimetype] specifies input/output for [command line].<br>
It formats as &quot;[input mimetype]/[output mimetype]&quot;.<br>
[input mimetype] can be the following:</p>
<ul>
<li>&quot;html&quot;: rich text</li>
<li>&quot;&quot; (empty): text</li>
<li>&quot;.js&quot; file name under configuration folder. The js file is evaluated and its return value is passed to [command line] as standard input.</li>
</ul>
<p>[output mimetype] is same as the one defined in &quot;<a href="../searchurl/cmds.html">Commands</a>&quot;.</p>
<ul>
<li>regular mimetype such as &quot;text/html&quot;: output as the mimetype</li>
<li>&quot;uweb&quot;: output as a link</li>
<li>&quot;termux&quot;: output as termux command</li>
</ul>
<p><a target="_self" href="i:0hcheck.js:https://fastly.jsdelivr.net/gh/torappinfo/uwebzh/zh/searchurl/txt/check.js">checked.js</a>: Evaluate checked.js and return value as standard input for the command line. For any file url ending with &quot;/&quot;, optionally append &quot;?[prefix][<em>[postfix]]&quot;. For example, &quot;file:///sdcard/?</em>.png&quot; lists all .png files under the folder &quot;/sdcard&quot;. Select files and process them with checked.js(such as &quot;copy to PC&quot; as the later example).</p>
<p>default.select sample file:<br>
copy2addressbar:uweb:printf i:15;cat<br>
copy2PCClipboard::ssh [user:password]@192.168.2.102 &quot;DISPLAY=:0 xsel -i&quot;<br>
richtext2PCClipboard:html:ssh [user:password]@192.168.2.102 &quot;DISPLAY=:0 xsel -i&quot;<br>
copyFiles:checked.js:while read fname;do scp $fname [user:password]@192.168.2.102:Downloads/.; done</p>
<p>Here we assume that the user PC has IP address as &quot;192.168.2.102&quot;.<br>
To use ssh or scp, users need to install uweb compatible Termux provided on the <a href="../index.html">uweb apk download page</a>, and install openssl under termux (apt install openssl).<br>
PCs need command &quot;xsel&quot; available to operate on copy/paste.</p>
</div>
</body>
</html>

139
en/readme/index.html Normal file
View file

@ -0,0 +1,139 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/readme/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title></title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<script>function notRepo(){let u=location.href.replace(/#$/, '');return u.endsWith('index.html')||u.endsWith('readme/');}</script>
<h3 id="uweb-browser-minimal-suckless-web-browser-with-unlimited-power">Uweb browser: minimal suckless web browser with unlimited power</h3>
<p><a href="README.zh-Hans.md" onclick="if(notRepo()){location='../../zh/readme/index.html#';return false;}">中文</a></p>
<p><a href="https://www.amazon.com/TorApp-Info-uweb-browser-for-geeks/dp/B098QPR6N5">Amazon appstore</a><br>
<a href="https://galaxystore.samsung.com/detail/info.torapp.uweb">Galaxy.Store</a><br>
<a href="en/download.md" onclick="if(notRepo()){location='../../en/changelog/index.html#';return false;}">Downloads</a></p>
<p><a href="https://torappinfo.github.io/uweb/en/">Uweb browser: downloads, plugins and tips</a><br>
(Mirrors: <a href="https://jamesfengcao.gitlab.io/uweb/en/">gitlab</a> <a href="https://torappinfo.frama.io/uweb/en/">frama</a> <a href="https://uweb.codeberg.page/en/">codeberg</a> <a href="https://repo.or.cz/uweb.git/blob_plain/HEAD:/en/index.html">repo</a> <a href="https://uweb.on-fleek.app/en/">fleek</a> <a href="https://uwebzh.netlify.app/en/">netlify</a> <a href="https://uweb.surge.sh/en/">surge</a> <a href="https://uwebbrowser-t27o4.kinsta.page">kinsta</a> <a href="https://uweb.zeabur.app/en/">zeabur</a> <a href="https://torappinfo.bitbucket.io/en/">bitbucket</a> <a href="https://muweb.pages.dev/en/">pages</a> <a href="https://uweb.vercel.app/en/">vercel</a> <a href="https://uweb.onrender.com/en/">render</a> <a href="en/mirrors.md" onclick="if(notRepo()){location='../../en/mirrors/index.html#';return false;}">More...</a>)</p>
<ul>
<li><a href="en/search.md" onclick="if(notRepo()){location='../search/index.html#';return false;}">AI chat as search engine</a>; optimized UI for both AI and traditional search; <a href="../input/index.html#">input helpers</a> for complex query.</li>
<li><a href="en/tips.md" onclick="if(notRepo()){location='../redirect/index.html#';return false;}">Global redirection</a> to bypass censorship.</li>
<li>Convenient: Any AI chatbot/book/dictionary/txt/command line/app/webapp (web extensions) as search engine.</li>
<li>Tiny: less than 250k.</li>
<li>Fast: run fast, even with thousands of user provided css/scripts/htmls.</li>
<li>Efficient: less touches, one click to reach any number of search engines without repeated input; automate online services.</li>
<li>Powerful: any native functionality with html5 enhancement and still secure; any urls to host website; javascript and shell scripting for general processing.</li>
<li>Customizable: user-defined menus, (new) buttons and gestures for user agents, bookmarklets, url services, shell commands, internal functionality links and text processing etc.</li>
<li>URL bar command line support (&quot;!&quot; and .js file as command).</li>
<li>Site-specific JS/CSS/HTML/preprocessing.</li>
<li>Online play/preview/preprocess for downloadable resources.</li>
<li>Multiple type profiles: switch any data including website logins, user configurations orthogonally.</li>
<li>Supports enhanced user &quot;hosts&quot; file. Empty IP address to lift all server-imposed limitations.</li>
<li>Website test automation scripting. crontab support (alarm clock and more).</li>
</ul>
<h4 id="main-features">Main features</h4>
<p>Custom paper size PDF export and long vector screenshot, TTS, text reflow, resource sniffer, translation, reader's mode, user-defined url redirection, webdav/http backup &amp; restore, auto next page, sending/receiving msg/file(s), site config (UA, no JS, no image, no 3rd party script/resource,active script, global scripts), http(s)/socks proxy, Wake-on-LAN, enabling html5 apps for local files (pdf/djvu/epub viewer, mdict dictionary lookup etc.).</p>
<ul>
<li>Bookmarklets (works for CSP sites and with option to auto apply to similar sites)</li>
<li>AD blocking (block whole root domain trees etc.)</li>
<li>Serverless local sites: PWA-kind web extension (chrome .crx &amp; firefox .xpi) support.</li>
<li>Resizable floating video support.</li>
</ul>
<h4 id="screenshots">Screenshots</h4>
<p><img src="https://i.postimg.cc/rsL9G5N1/home1.png" alt=""><br>
<img src="https://i.postimg.cc/9QxJ3Rc2/globalcss.png" alt=""><br>
<img src="https://i.postimg.cc/VksDHBQ4/globaljs.png" alt=""><br>
<img src="https://i.postimg.cc/HLV3TYLy/longclick.png" alt=""><br>
<img src="https://i.postimg.cc/XJ58ysdN/option1.png" alt=""><br>
<img src="https://i.postimg.cc/0NFnQT6H/option2.png" alt=""></p>
<h4 id="ebrowser-for-windows-macos-and-linux"><a href="misc/ebrowser/README.md" onclick="if(notRepo()){location='../../en/ebrowserreadme/index.html#';return false;}">Ebrowser</a> for Windows, MacOS and Linux</h4>
<p>Ebrowser is a simple version of uweb browser on the desktop.</p>
<ul>
<li>Fully open source.</li>
<li>Capture long screenshot as vector graphics.</li>
<li>Enabling web tech for vector designing to replace Adobe Illustrator/Inkscape.</li>
</ul>
<h4 id="help-with-localization">Help with localization</h4>
<p>We encourage everyone to help with localization. The following is how to do.</p>
<ul>
<li>Fork this repository</li>
<li>Copy res/values/strings.xml to path like res/values-%(lang)/, replace %(lang) with <a href="http://www.loc.gov/standards/iso639-2/php/code_list.php">the ISO 639-1 language code</a>.</li>
<li>Translate res/values-%(lang)/strings.xml</li>
<li>Translate assets/help_%(lang).html from assets/help_en.html</li>
<li>Make a Pull Request</li>
</ul>
</div>
<p>Last Modified: 12 November 2025<br>
use uweb.codeberg<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

114
en/redirect/index.html Normal file
View file

@ -0,0 +1,114 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/redirect/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Resource redirection</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Resource redirection
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
<li><a href="../tags/redirection/index.html#">redirection</a> </li>
</ul>
<p>⚠️<span style="color:red">Redirection forwards cookies</span> with the setting option &quot;Redirect cookies&quot; enabled, so use the option with care.</p>
<h4 id="setting-options-url-redirection-vs-resource-redirection">Setting options: &quot;Url redirection&quot; vs. &quot;Resource redirection&quot;</h4>
<p>&quot;Url redirection&quot; redirects the main/page url only while &quot;Resource redirection&quot; is for all urls in the page.</p>
<h4 id="global-redirection">Global redirection</h4>
<p><a href="i:60/data/data/info.torapp.uweb/files/config.html:https://jamesfengcao.codeberg.page/en/searchurl/config.html">Global redirection</a> is enabled with the setting option &quot;Resource redirection&quot; or both &quot;Url redirection&quot; and &quot;Redirect cookies&quot;.</p>
<p>When a valid global redirection url is set, the &quot;default.redirect&quot; has no effect, and any url resource is fetched with the new url by appending the original url to the global redirection url.</p>
<ul>
<li>
<p>If the global redirection url ends with '/', '?', or '=', then the resource is fetched with by the url &quot;[global redirection url] + [url]&quot;. For example, &quot;https://domain.com/pathXXX/https://cnn.com&quot;.</p>
</li>
<li>
<p>(to provide more options to users) If the global redirection url does not end with '/', '?' or '=', it means the global redirection url is naked. then the resource is fetched with by the url &quot;[global redirection url] + '/'+ [scheme]+ '/' + [url without scheme]&quot;. For example, when the global redirection url is &quot;https://domain.com/pathXXX&quot;, the real url to visit &quot;https://cnn.com&quot; is &quot;https://domain.com/pathXXX/https/cnn.com&quot;.</p>
</li>
</ul>
<p>Example: &quot;https://muweb.pages.dev/redirect?&quot;</p>
<p><a href="../searchurl/cloudflare/redirect.js">global redirection code for cloudflare worker</a> free deployment: The global redirection url is &quot;https://name.username.workers.dev/&quot;, which is just the worker's domain name.</p>
<h4 id="defaultredirect-valid-only-without-global-redirection-url">&quot;default.redirect&quot; (valid only without global redirection url)</h4>
<p>Click the following links to append mirrors to the file &quot;default.redirect&quot;:<br>
<a target="_self" href="i:0gdefault.redirect:../../zh/searchurl/txt/redirect.cfg">google recaptcha mirror</a></p>
<p>Each line of the file &quot;default.redirect&quot; has the following format:<br>
[domain name]:[regular expression]:[replacement expression]</p>
<p>in which &quot;[regular expression]&quot; is as defined by java language, and cannot have &quot;:&quot; inside; if empty, it defaults to be same as &quot;[domain name]&quot;.</p>
<h5 id="ways-to-enable-domain-redirection">Ways to enable domain redirection:</h5>
<ul>
<li><a href="../urls/index.html#">Long pressing the image button</a></li>
<li>Long pressing the setting button, enable the option &quot;url redirection&quot;.</li>
<li>Long pressing the setting button, enable the option &quot;Resource redirection&quot;.</li>
</ul>
</div>
<p>Last Modified: 9 April 2025<br>
fix broken links<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

118
en/rjs/index.html Normal file
View file

@ -0,0 +1,118 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/rjs/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Execute javascript codes</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Execute javascript codes
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<p><a href="../sitejs/index.html#">javascript for domains</a><br>
<a href="../globalcss/index.html#">Earliest loaded global javascript</a> files locates in the subfolder &quot;css&quot; of app private folder.</p>
<p><b>Global javascript</b> files locates in the subfolder &quot;js&quot; of app private folder. Long press button [☰] to configure. Click the following links to install:<br>
<a target="_self" href="i:0hjs/savePassword.js:../../zh/searchurl/txt/passwdsave.js">Save password</a><br>
<a target="_self" href="i:0hjs/instantPage.js:https://fastly.jsdelivr.net/npm/instant.page">Instant page</a></p>
<p><b>large size javascript code</b> can be installed to the folder &quot;bookmarklet&quot; (long pressing button &quot;js&quot; to popup menu):<br>
<a target="_self" href="i:0hbookmarklet/!googleTranslate.js:https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit:%0A{let d=document,b=d.body,v=d.createElement('div');v.id='google_translate_element';v.style='position:fixed;bottom:10px;right:10px;cursor:pointer;z-index:9999';b.insertBefore(v,b.firstChild);function googleTranslateElementInit(){new google.translate.TranslateElement({layout:google.translate.TranslateElement.InlineLayout.SIMPLE,multilanguagePage:true,pageLanguage:'auto',includedLanguages:'zh-CN,zh-TW,en,ko,ja'},'google_translate_element');}}">google translation</a></p>
<p><a target="_self" href='i:0hbookmarklet/eruda.js:https://fastly.jsdelivr.net/npm/eruda:%0Aeruda.init()'>Eruda</a><br>
<a target="_self" href="i:0hbookmarklet/performance.js:https://fastly.jsdelivr.net/gh/micmro/performance-bookmarklet/dist/performanceBookmarklet.min.js">Performance</a></p>
<p><b>default.bml</a> to define bookmarklet with argument. Each line of default.bml has the following format:<br>
[bookmarklet name]:[bookmarklet id with argument]</p>
<p>where [bookmarklet id with argument] could be:</p>
<ul>
<li>[fullpath-to-js-file]#[argument]</li>
<li>[bookmarklet index] beginning with two digits followed by bookmarklet function argument. They are used as index of bootmarklet. For example, &quot;00&quot; as the first local bookmarklet; &quot;01&quot; as the first remote script; then &quot;02&quot; as the second local bookmarklet, ...</li>
</ul>
<p>Note: Bookmarklets whose names begin with &quot;!&quot; are allowed to load remote js on CSP (Content Security Policy) sites.</p>
<p><b>Remote javascript</b> is defined in default.rjs. Click the following link to install. (<b>Force exit and re-launch the app</b>, then long press the &quot;search&quot; button to popup the menu.)</p>
<p><a href="i:04Selection to sentence:;let g='sentence';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);">Selection to sentence:;let g='sentence';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);</a></p>
<p><a href="i:04Selection to line:;let g='line';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);">Selection to line:;let g='line';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);</a></p>
<p><a href="i:04Selection to paragraph:;let g='paragraph';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);">Selection to paragraph:;let g='paragraph';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);</a></p>
<p><a href="i:04markdown:['https://cdn.jsdelivr.net/npm/marked@12.0.2/marked.min.js'];var d=document;d.body.innerHTML=marked.parse(d.body.textContent);d.title=d.title||d.body.firstElementChild.innerText.trim();">markdown:['https://cdn.jsdelivr.net/npm/marked@12.0.2/marked.min.js'];var d=document;d.body.innerHTML=marked.parse(d.body.textContent);d.title=d.title||d.body.firstElementChild.innerText.trim();</a></p>
<p><a href="i:04mermaid:;loadModuleJS(`import mermaid from 'https://unpkg.com/mermaid/dist/mermaid.esm.min.mjs';mermaid.initialize({startOnLoad:true});`)">mermaid:;loadModuleJS(<code>import mermaid from 'https://unpkg.com/mermaid/dist/mermaid.esm.min.mjs';mermaid.initialize({startOnLoad:true});</code>)</a></p>
<p><a href="i:04mathjax:['https://fastly.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js']">mathjax:['https://fastly.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js']</a></p>
<p><a href="i:04New tab to open links:;let d=document;b=d.createElement('base');b.setAttribute('target','_blank');d.head.appendChild(b)">New tab to open links:;let d=document;b=d.createElement('base');b.setAttribute('target','_blank');d.head.appendChild(b)</a></p>
<p><a href="i:04Site search:;open('i:15site:' + location.hostname)">Site search:;open('i:15site:' + location.hostname)</a></p>
<p><a href="i:04Spell check:;let t=document.getElementsByTagName('textarea');let v=t[0].spellcheck;if(v==null)v=false;t[0].spellcheck=!v">Spell check:;let t=document.getElementsByTagName('textarea');let v=t[0].spellcheck;if(v==null)v=false;t[0].spellcheck=!v</a></p>
<p>Remote script configuration file &quot;default.rjs&quot; whose lines have the following format:<br>
[script name]:[javascript code to return url arrays]</p>
<h4 id="activated-scripts">Activated scripts</h4>
<p>Activate either local (bookmarklets) or remote js to execute the code on the similar sites with option &quot;Activate user script&quot;.</p>
<p>Since activated scripts use internal mechanism of <a href="../links/index.html#">&quot;i:0m&quot; urls</a>, the script itself cannot have <span style="color:red">'H', '?' or '/'</span> as its very first character.</p>
<h4 id="allow-remote-js-on-csp-content-security-policy-sites">Allow remote js on CSP (Content Security Policy) sites</h4>
<p>All remote js (default.rjs) are allowed to execute on CSP sites. Local js files without remote resource access work fine when under the folder &quot;bookmarklet&quot;; for those needing remote resource, file name must begin with &quot;!&quot;. Others needs to be refered in default.rjs as http urls such as &quot;https://local/...&quot; (<a href="../html5/index.html#">html5</a> or <a href="../offlinecache/index.html#">offline cache</a>) .</p>
</div>
<p>Last Modified: 13 February 2025<br>
update AI engines<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

501
en/search.md Normal file
View file

@ -0,0 +1,501 @@
---
title: Search engine query URLs
date: 2024-12-03
log: |
Add AI engines
---
Clicking the following search engine configuration links (or append the link text to the file "home5.search") installs search engines with [uweb browser](../index.html#). [ebrowser](../ebrowserreadme/index.html#) users can change the engine name to be shorter (ex. 2 alphabets) as shortcut (click the link below and choose 'Cancel' to have a chance to modify the engine name in address bar).
[AI](#aiSE) [Recommended](#mainSE) [Common](#commonSE) [Language](#langSE) [Science](#textbookSE) [More](#moreSE) [Medical](#medicalSE) [Scholar](#scholarSE) [Dev](#devSE) [Local](#localSE)
<a id="aiSE">AI</a> (Appending "%250D" after "%s" as ENTER for uweb or "%0D" for ebrowser):
<a href="i:00gemini:https://gemini.google.com/app?q=">gemini:https://gemini.google.com/app?q=</a>
<a href="i:00gAI:https://google.com/search?udm=50&q=">gAI:https://google.com/search?udm=50&q=</a>
<a href="i:00copilot:https://copilot.microsoft.com/?q=">copilot:https://copilot.microsoft.com/?q=</a>
<a href="i:00felo:https://felo.ai/search?q=">felo:https://felo.ai/search?q=</a>
<a href="i:00search.sh:https://search.sh/?q=">search.sh:https://search.sh/?q=</a>
<a href="i:00z:https://chat.z.ai/?q=">z:https://chat.z.ai/?q=</a>
<a href="i:00deepseek:i:0/js/uwebset.js:https://chat.deepseek.com#uweb=%s">deepseek:i:0/js/uwebset.js:https://chat.deepseek.com#uweb=%s</a>
<a href="i:00grok:https://grok.com/search?q=">grok:https://grok.com/search?q=</a>
<a href="i:00meta:https://www.meta.ai/search?q=">meta:https://www.meta.ai/search?q=</a>
<a href="i:00aoyo:https://aoyo.ai/search/?q=">aoyo:https://aoyo.ai/search/?q=</a>
<a href="i:00monica.im:https://monica.im/home/chat/deepseek-r1/deepseek_reasoner?q=">monica.im:https://monica.im/home/chat/deepseek-r1/deepseek_reasoner?q=</a>
<a href="i:00monica:https://monica.so/answers?q=">monica:https://monica.so/answers?q=</a>
<a href="i:00giz:https://app.giz.ai/assistant?mode=chat&prompt=">giz:https://app.giz.ai/assistant?mode=chat&prompt=</a>
<a href="i:00longcat:i:0/js/uweb2edit.js:https://longcat.chat/#uweb=%3Cp%3E%s%3C/p%3E">longcat:i:0/js/uweb2edit.js:https://longcat.chat/#uweb=%3Cp%3E%s%3C/p%3E</a>
<a href="i:00lmarena:i:0/js/uwebset.js:https://lmarena.ai/#uweb=%s">lmarena:i:0/js/uwebset.js:https://lmarena.ai/#uweb=%s</a>
<a href="i:00miromind:i:0/js/uwebset.js:https://dr.miromind.ai/#uweb=%s">miromind:i:0/js/uwebset.js:https://dr.miromind.ai/#uweb=%s</a>
<a href="i:00txyz:i:0/js/uwebset.js:https://app.txyz.ai#uweb=%s">txyz:i:0/js/uwebset.js:https://app.txyz.ai#uweb=%s</a>
<a href="i:00komo:i:0/js/uwebset.js:https://komo.ai#uweb=%s">komo:i:0/js/uwebset.js:https://komo.ai#uweb=%s</a>
<a href="i:00solab:i:0/js/uwebset.js:https://www.solab.ai#uweb=%s">solab:i:0/js/uwebset.js:https://www.solab.ai#uweb=%s</a>
<a href="i:00isou:https://isou.chat/search?q=">isou:https://isou.chat/search?q=</a>
<a href="i:00bagoodex:https://bagoodex.io/search?q=">bagoodex:https://bagoodex.io/search?q=</a>
<a href="i:00andi:https://andisearch.com/?q=">andi:https://andisearch.com/?q=</a>
<a href="i:00scira:https://scira.ai/?q=">scira:https://scira.ai/?q=</a>
<a href="i:00gigabrain:https://thegigabrain.com/search/">gigabrain:https://thegigabrain.com/search/</a>
<a href="i:00liner:https://getliner.com?q=">liner:https://getliner.com?q=</a>
<a href="i:00lenso:https://lenso.ai/en/search-by-text?type=relatedText&desc=">lenso:https://lenso.ai/en/search-by-text?type=relatedText&desc=</a>
<a href="i:00phind:https://www.phind.com/search?q=">phind:https://www.phind.com/search?q=</a>
<a href="i:00xanswer:https://www.xanswer.com/search?q=">xanswer:https://www.xanswer.com/search?q=</a>
<a href="i:00mistral:https://chat.mistral.ai/chat?q=">mistral:https://chat.mistral.ai/chat?q=</a>
<a href="i:00mindfulq:https://www.mindfulq.com/s?q=">mindfulq:https://www.mindfulq.com/s?q=</a>
<a href="i:00searchgptool:https://searchgptool.ai/search?q=">searchgptool:https://searchgptool.ai/search?q=</a>
<a href="i:00iask:https://iask.ai/?q=">iask:https://iask.ai/?q=</a>
<a href="i:00perplexity:https://www.perplexity.ai/?q=">perplexity:https://www.perplexity.ai/?q=</a>
<a href="i:00youChat:https://you.com/search?tbm=youchat&q=">youChat:https://you.com/search?tbm=youchat&q=</a>
<a href="i:00youWrite:https://you.com/search?tbm=youwrite&q=">youWrite:https://you.com/search?tbm=youwrite&q=</a>
<a href="i:00youImagine:https://you.com/search?tbm=imagine&q=">youImagine:https://you.com/search?tbm=imagine&q=</a>
<a href="i:00you:https://you.com/search?q=">you:https://you.com/search?q=</a>
<a href="i:00xdash:https://www.xdash.ai/search?q=">xdash:https://www.xdash.ai/search?q=</a>
<a href="i:00medisearch:https://medisearch.io/results/">medisearch:https://medisearch.io/results/</a>
<a href="i:00consensus:https://consensus.app/results/?synthesize=on&q=">consensus:https://consensus.app/results/?synthesize=on&q=</a>
<a href="i:00yoursearch:https://app.yoursearch.ai/?q=">yoursearch:https://app.yoursearch.ai/?q=</a>
<a href="i:00awesomerepo:https://www.awesome-repositories.com/s/results-with-ai/">awesomerepo:https://www.awesome-repositories.com/s/results-with-ai/</a>
<a href="i:00searchGPT:https://chatgpt.com?hints=search&q=">searchGPT:https://chatgpt.com?hints=search&q=</a>
<a href="i:00claude:https://claude.ai/new?q=">claude:https://claude.ai/new?q=</a>
<a href="i:00floatsearch:i:0/js/uweb2ta.js:https://floatsearch.ai#uweb=%s">floatsearch:i:0/js/uweb2ta.js:https://floatsearch.ai#uweb=%s</a>
<a href="i:00morphic:i:0/js/uweb2ta.js:https://www.morphic.sh#uweb=%s">morphic:i:0/js/uweb2ta.js:https://www.morphic.sh#uweb=%s</a>
<a href="i:00lambda:i:0/js/uweb2ta.js:https://lambda.chat/chatui/#uweb=%s">lambda:i:0/js/uweb2ta.js:https://lambda.chat/chatui/#uweb=%s</a>
<a href="i:00blackbox:https://www.blackbox.ai/?q=">blackbox:https://www.blackbox.ai/?q=</a>
<a href="i:00EBAI:i:0/js/uweb2input.js:https://www.britannica.com/chatbot#uweb=%s">EBAI:i:0/js/uweb2input.js:https://www.britannica.com/chatbot#uweb=%s</a>
<a href="i:00graphthem:i:0/js/uweb2input.js:https://graphthem.com/search?#uweb=%s">graphthem:i:0/js/uweb2input.js:https://graphthem.com/search?#uweb=%s</a>
<a href="i:00correkt:i:0/js/uweb2ta.js:https://correkt.ai#uweb=%s">correkt:i:0/js/uweb2ta.js:https://correkt.ai#uweb=%s</a>
<a href="i:00devv:i:0/js/uweb2edit.js:https://devv.ai#uweb=%3Cp%3E%s%3C/p%3E">devv:i:0/js/uweb2edit.js:https://devv.ai#uweb=%3Cp%3E%s%3C/p%3E</a>
<a href="i:00duck.ai:https://duckduckgo.com?ia=chat&q=">duck.ai:https://duckduckgo.com?ia=chat&q=</a>
<a href="i:00lepton:i:0/js/uweb2input.js:https://search.lepton.run/#uweb=%s">lepton:i:0/js/uweb2input.js:https://search.lepton.run/#uweb=%s</a>
<a href="i:00stepfun:i:0/js/uwebset.js:https://www.stepfun.com/chats/new#uweb=%s">stepfun:i:0/js/uwebset.js:https://www.stepfun.com/chats/new#uweb=%s</a>
<a href="i:00poe:https://poe.com/DeepSeek-R1?q=">poe:https://poe.com/DeepSeek-R1?q=</a>
<a href="i:00t3:https://www.t3.chat/new?q=">t3:https://www.t3.chat/new?q=</a>
AI (The search tab must not be in background. Appending "%250D" after "%s" as ENTER for uweb or "%0D" for ebrowser.)
<a href="i:00hika:i:0/js/uweb2input2.js:https://hika.fyi/search#uweb=%s">hika:i:0/js/uweb2input2.js:https://hika.fyi/search#uweb=%s</a>
<a id="mainSE">Recommended engines</a>
<a href="i:00Engines:i:40%s_00">Engines:i:40%s_00</a>
<a href="i:00bing image:http://bing.com/images/search?q=">bing image:http://bing.com/images/search?q=</a>
<a href="i:00google image:http://www.google.com/images?as_q=">google image:http://www.google.com/images?as_q=</a>
<a href="i:00flickr:http://www.flickr.com/photos/tags/">flickr:http://www.flickr.com/photos/tags/</a>
<a href="i:00Yandex image:https://yandex.com/images/search?text=">Yandex image:https://yandex.com/images/search?text=</a>
<a href="i:00wiki:https://en.wikipedia.org/wiki/Special:Search?search=">wiki:https://en.wikipedia.org/wiki/Special:Search?search=</a>
<a href="i:00wikipedia:http://en.wikipedia.org/?search=">wikipedia:http://en.wikipedia.org/?search=</a>
<a href="i:00wikifull:http://en.wikipedia.org/wiki/Special:Search?fulltext=Search&search=">wikifull:http://en.wikipedia.org/wiki/Special:Search?fulltext=Search&search=</a>
<a href="i:00Youtube:https://www.youtube.com/results?search_query=">Youtube:https://www.youtube.com/results?search_query=</a>
<a href="i:00eBay:https://www.ebay.com/sch/i.html?_nkw=">eBay:https://www.ebay.com/sch/i.html?_nkw=</a>
<a href="i:00Quora:https://www.quora.com/search?q=">Quora:https://www.quora.com/search?q=</a>
<a href="i:00Pinterest:https://www.pinterest.com/search/pins/?q=">Pinterest:https://www.pinterest.com/search/pins/?q=</a>
<a href="i:00LinkedIn:https://www.linkedin.com/search/results/all/?keywords=">LinkedIn:https://www.linkedin.com/search/results/all/?keywords=</a>
<a href="i:00Netflix:https://www.netflix.com/search?q=">Netflix:https://www.netflix.com/search?q=</a>
<a href="i:00Spotify:https://open.spotify.com/search/">Spotify:https://open.spotify.com/search/</a>
<a href="i:00Medium:https://medium.com/search?q=">Medium:https://medium.com/search?q=</a>
<a href="i:00TripAdvisor:https://www.tripadvisor.com/Search?q=">TripAdvisor:https://www.tripadvisor.com/Search?q=</a>
<a href="i:00incaption:https://incaptions.com/">incaption:https://incaptions.com/</a>
<a href="i:00answer:http://mobile.answers.com/">answer:http://mobile.answers.com/</a>
<a href="i:00twitter:https://twitter.com/search?q=">twitter:https://twitter.com/search?q=</a>
<a href="i:00Facebook:https://www.facebook.com/search/str/%s/keywords_search">Facebook:https://www.facebook.com/search/str/%s/keywords_search</a>
<a href="i:00Instagram:https://www.instagram.com/explore/tags/%s/">Instagram:https://www.instagram.com/explore/tags/%s/</a>
<a href="i:00social-search:https://www.social-searcher.com/social-buzz/?q5=">social-search:https://www.social-searcher.com/social-buzz/?q5=</a>
<a href="i:00reddit:http://reddit.com/search?q=">reddit:http://reddit.com/search?q=</a>
<a href="i:00boardreader:https://boardreader.com/s/%s.html">boardreader:https://boardreader.com/s/%s.html</a>
<a href="i:00bingvideo:https://www.bing.com/videos/search?q=">bingvideo:https://www.bing.com/videos/search?q=</a>
<a href="i:00vsearch:https://www.vsearch.me/s?q=">vsearch:https://www.vsearch.me/s?q=</a>
<a href="i:00crowdview:https://crowdview.ai/search?q=">crowdview:https://crowdview.ai/search?q=</a>
<a href="i:00forumscout:https://forumscout.app/search?q=">forumscout:https://forumscout.app/search?q=</a>
<a href="i:00groups:http://groups.google.com/groups/search?q=">groups:http://groups.google.com/groups/search?q=</a>
<a href="i:00wolfram:https://www.wolframalpha.com/input/?i=">wolfram:https://www.wolframalpha.com/input/?i=</a>
<a href="i:00fxsolver:https://www.fxsolver.com/browse/?q=">fxsolver:https://www.fxsolver.com/browse/?q=</a>
<a href="i:00book_google:https://google.com/search?q=%22parent+directory%22+pdf+OR+epub+OR+DjVU+OR+xps+%22%s%22+-html+-htm+-shtml+-phtml+-php+-buy+-aspx+-jsp+-asp+-cgi+-pdf+-ftp+-unknownsecret&num=100&filter=0">book_google:https://google.com/search?q=%22parent+directory%22+pdf+OR+epub+OR+DjVU+OR+xps+%22%s%22+-html+-htm+-shtml+-phtml+-php+-buy+-aspx+-jsp+-asp+-cgi+-pdf+-ftp+-unknownsecret&num=100&filter=0</a>
<a href="i:00annas-archive:https://annas-archive.org/search?q=">annas-archive:https://annas-archive.org/search?q=</a>
<a href="i:00libgen:http://gen.lib.rus.ec/search.php?req=">libgen:http://gen.lib.rus.ec/search.php?req=</a>
<a href="i:00google_file:https://google.com/search?q=intitle:index.of+%22parent+directory%22+">google_file:https://google.com/search?q=intitle:index.of+%22parent+directory%22+</a>
<a href="i:00apkcombo:https://apkcombo.com/search/">apkcombo:https://apkcombo.com/search/</a>
Note: "Engines" needs file "engine.search"whose format is same as "home.search" except that the keyword part of url must be denoted with "%s". Pressing the right arrow button on the search result page will automatically query with next engine in the file.
<a id="commonSE">Common engines</a>:
<a href="i:00google:https://google.com/search?q=">google:https://google.com/search?q=</a>
<a href="i:00udm14:https://google.com/search?udm=14&q=">udm14:https://google.com/search?udm=14&q=</a>
<a href="i:00bing:http://www.bing.com/search?q=">bing:http://www.bing.com/search?q=</a>
<a href="i:00exa:https://exa.ai/search?c=all&q=">exa:https://exa.ai/search?c=all&q=</a>
<a href="i:00togoda:https://togoda.com/search?query=">togoda:https://togoda.com/search?query=</a>
<a href="i:00marginalia:https://search.marginalia.nu/search?query=">marginalia:https://search.marginalia.nu/search?query=</a>
<a href="i:00mojeek:https://www.mojeek.com/search?q=">mojeek:https://www.mojeek.com/search?q=</a>
<a href="i:00rightdao:https://rightdao.com/search?q=">rightdao:https://rightdao.com/search?q=</a>
<a href="i:00yep:https://yep.com/web?q=">yep:https://yep.com/web?q=</a>
<a href="i:00seznam:https://search.seznam.cz/?q=">seznam:https://search.seznam.cz/?q=</a>
<a href="i:00metager:https://metager.org/meta/meta.ger3?eingabe=">metager:https://metager.org/meta/meta.ger3?eingabe=</a>
<a href="i:00brave:https://search.brave.com/search?q=">brave:https://search.brave.com/search?q=</a>
<a href="i:00ellpedia:https://en.ellpedia.com/search?q=">ellpedia:https://en.ellpedia.com/search?q=</a>
<a href="i:00gemini:https://portal.mozz.us/gemini/geminispace.info/search%3F">gemini:https://portal.mozz.us/gemini/geminispace.info/search%3F</a>
<a href="i:00waldo:https://waldo.com/search?q=">waldo:https://waldo.com/search?q=</a>
<a href="i:00xda:https://www.xda-developers.com/search/">xda:https://www.xda-developers.com/search/</a>
<a href="i:00pix:https://www.google.com/search?tbm=isch&q=">pix:https://www.google.com/search?tbm=isch&q=</a>
<a href="i:00youtube:https://youtube.com/results?search_query=">youtube:https://youtube.com/results?search_query=</a>
<a href="i:00news:https://news.search.yahoo.com/search/news?p=">news:https://news.search.yahoo.com/search/news?p=</a>
<a href="i:00stock:https://finance.yahoo.com/quote/">stock:https://finance.yahoo.com/quote/</a>
<a href="i:00amazon:https://www.amazon.com/s/?field-keywords=">amazon:https://www.amazon.com/s/?field-keywords=</a>
<a href="i:00weather:https://www.wunderground.com/cgi-bin/findweather/getForecast?query=">weather:https://www.wunderground.com/cgi-bin/findweather/getForecast?query=</a>
<a href="i:00IMDB:https://www.imdb.com/find?q=">IMDB:https://www.imdb.com/find?q=</a>
<a href="i:00film review:https://www.rottentomatoes.com/search/?search=">film review:https://www.rottentomatoes.com/search/?search=</a>
<a href="i:00goodreads:https://www.goodreads.com/search?query=">goodreads:https://www.goodreads.com/search?query=</a>
<a href="i:00audible:http://www.audible.com/search?sort=review-rank&advsearchKeywords=">audible:http://www.audible.com/search?sort=review-rank&advsearchKeywords=</a>
<a href="i:00audiobay:http://audiobookbay.se/?s=">audiobay:http://audiobookbay.se/?s=</a>
<a href="i:00telegramsearcher:https://telegramsearcher.com/search?q=">telegramsearcher:https://telegramsearcher.com/search?q=</a>
<a href="i:00lyzem:https://lyzem.com/search?q=">lyzem:https://lyzem.com/search?q=</a>
<a id="langSE">language</a>:
<a href="i:00webster1913:https://www.websters1913.com/words/">webster1913:https://www.websters1913.com/words/</a>
<a href="i:00merriam-webster:https://www.merriam-webster.com/dictionary/">merriam-webster:https://www.merriam-webster.com/dictionary/</a>
<a href="i:00dictionary:https://www.dictionary.com/browse/">dictionary:https://www.dictionary.com/browse/</a>
<a href="i:00freedictionary:https://www.thefreedictionary.com/">freedictionary:https://www.thefreedictionary.com/</a>
<a href="i:00legal_fd:https://legal-dictionary.thefreedictionary.com/">legal_fd:https://legal-dictionary.thefreedictionary.com/</a>
<a href="i:00finance_fd:https://financial-dictionary.thefreedictionary.com/">finance_fd:https://financial-dictionary.thefreedictionary.com/</a>
<a href="i:00wikipedia_fd:https://encyclopedia.thefreedictionary.com/">wikipedia_fd:https://encyclopedia.thefreedictionary.com/</a>
<a href="i:00encyclopedia_fd:https://encyclopedia2.thefreedictionary.com/">encyclopedia_fd:https://encyclopedia2.thefreedictionary.com/</a>
<a href="i:00wordreference:https://www.wordreference.com/definition/">wordreference:https://www.wordreference.com/definition/</a>
<a href="i:00vocabulary:https://www.vocabulary.com/dictionary/">vocabulary:https://www.vocabulary.com/dictionary/</a>
<a href="i:00etymology:https://www.etymonline.com/search?q=">etymology:https://www.etymonline.com/search?q=</a>
<a href="i:00powerthesaurus:https://www.powerthesaurus.org/%s/synonyms">powerthesaurus:https://www.powerthesaurus.org/%s/synonyms</a>
<a href="i:00macmillanthesaurus:https://www.macmillanthesaurus.com/search/?auto=complete&q=">macmillanthesaurus:https://www.macmillanthesaurus.com/search/?auto=complete&q=</a>
<a href="i:00ludwig:https://ludwig.guru/s/">ludwig:https://ludwig.guru/s/</a>
<a href="i:00webster:https://www.merriam-webster.com/dictionary/">webster:https://www.merriam-webster.com/dictionary/</a>
<a href="i:00googledict:http://googledictionary.freecollocation.com/meaning?word=">googledict:http://googledictionary.freecollocation.com/meaning?word=</a>
<a href="i:00freetts_ru:https://freetts.com/Home/PlayAudio?Language=ru-RU&Voice=ru-RU-Standard-A&id=undefined&type=0&TextMessage=">freetts_ru:https://freetts.com/Home/PlayAudio?Language=ru-RU&Voice=ru-RU-Standard-A&id=undefined&type=0&TextMessage=</a>
<a href="i:00freetts_ar:https://freetts.com/Home/PlayAudio?Language=ar-XA&Voice=ar-XA-Standard-A&id=undefined&type=0&TextMessage=">freetts_ar:https://freetts.com/Home/PlayAudio?Language=ar-XA&Voice=ar-XA-Standard-A&id=undefined&type=0&TextMessage=</a>
<a id="textbookSE">Science</a>:
<a href="i:00britannica:https://www.britannica.com/search?query=">britannica:https://www.britannica.com/search?query=</a>
<a href="i:00mathRef:https://reference.wolfram.com/search/?q=">mathRef:https://reference.wolfram.com/search/?q=</a>
<a href="i:00mathSE:https://math.stackexchange.com/search?q=">mathSE:https://math.stackexchange.com/search?q=</a>
<a href="i:00phySE:https://physics.stackexchange.com/search?q=">phySE:https://physics.stackexchange.com/search?q=</a>
<a href="i:00physicsForum:https://www.physicsforums.com/search/2195918/?q=">physicsForum:https://www.physicsforums.com/search/2195918/?q=</a>
<a href="i:00pubchem SMILES:https://pubchem.ncbi.nlm.nih.gov/#input_type=smiles&query=">pubchem SMILES:https://pubchem.ncbi.nlm.nih.gov/#input_type=smiles&query=</a>
<a href="i:00pubchem:https://pubchem.ncbi.nlm.nih.gov/#query=">pubchem:https://pubchem.ncbi.nlm.nih.gov/#query=</a>
<a href="i:00chemSE:https://chemistry.stackexchange.com/search?q=">chemSE:https://chemistry.stackexchange.com/search?q=</a>
<a href="i:00chem:https://www.ncbi.nlm.nih.gov/pccompound?term=">chem:https://www.ncbi.nlm.nih.gov/pccompound?term=</a>
<a href="i:00proofwiki:https://proofwiki.org/w/index.php?search=">proofwiki:https://proofwiki.org/w/index.php?search=</a>
<a href="i:00physics:http://www.physics.org/explore-results-all.asp?q=">physics:http://www.physics.org/explore-results-all.asp?q=</a>
<a href="i:00biology:https://www.biologyonline.com/dictionary/">biology:https://www.biologyonline.com/dictionary/</a>
<a href="i:00nist chem:https://webbook.nist.gov/cgi/cbook.cgi?Formula=">nist chem:https://webbook.nist.gov/cgi/cbook.cgi?Formula=</a>
<a href="i:00chemiday:https://chemiday.com/search/?lang=en&q=">chemiday:https://chemiday.com/search/?lang=en&q=</a>
<a href="i:00chem.libretexts:https://chem.libretexts.org/Special:Search?q=">chem.libretexts:https://chem.libretexts.org/Special:Search?q=</a>
<a href="i:00bio.libretexts:https://bio.libretexts.org/Special:Search?q=">bio.libretexts:https://bio.libretexts.org/Special:Search?q=</a>
<a href="i:00phys.libretexts:https://phys.libretexts.org/Special:Search?q=">phys.libretexts:https://phys.libretexts.org/Special:Search?q=</a>
<a href="i:00med.libretexts:https://med.libretexts.org/Special:Search?q=">med.libretexts:https://med.libretexts.org/Special:Search?q=</a>
<a href="i:00math.libretexts:https://math.libretexts.org/Special:Search?q=">math.libretexts:https://math.libretexts.org/Special:Search?q=</a>
<a href="i:00stats.libretexts:https://stats.libretexts.org/Special:Search?q=">stats.libretexts:https://stats.libretexts.org/Special:Search?q=</a>
<a href="i:00geo.libretexts:https://geo.libretexts.org/Special:Search?q=">geo.libretexts:https://geo.libretexts.org/Special:Search?q=</a>
<a href="i:00eng.libretexts:https://eng.libretexts.org/Special:Search?q=">eng.libretexts:https://eng.libretexts.org/Special:Search?q=</a>
<a href="i:00biz.libretexts:https://biz.libretexts.org/Special:Search?q=">biz.libretexts:https://biz.libretexts.org/Special:Search?q=</a>
<a href="i:00human.libretexts:https://human.libretexts.org/Special:Search?q=">human.libretexts:https://human.libretexts.org/Special:Search?q=</a>
<a href="i:00socialsci.libretexts:https://socialsci.libretexts.org/Special:Search?q=">socialsci.libretexts:https://socialsci.libretexts.org/Special:Search?q=</a>
<a href="i:00workforce.libretexts:https://workforce.libretexts.org/Special:Search?q=">workforce.libretexts:https://workforce.libretexts.org/Special:Search?q=</a>
<a id="moreSE">More engines</a>:
<a href="i:00oscobo:https://www.oscobo.com/search.php?q=">oscobo:https://www.oscobo.com/search.php?q=</a>
<a href="i:00lycos:https://search.lycos.com/web/?q=">lycos:https://search.lycos.com/web/?q=</a>
<a href="i:00technorati:http://technorati.com/search/index.php?q=">technorati:http://technorati.com/search/index.php?q=</a>
<a href="i:00qwant:https://lite.qwant.com/?q=">qwant:https://lite.qwant.com/?q=</a>
<a href="i:00swisscows:https://swisscows.com/web?query=">swisscows:https://swisscows.com/web?query=</a>
<a href="i:00ecosia:https://www.ecosia.org/search?q=">ecosia:https://www.ecosia.org/search?q=</a>
<a href="i:00ghostery:https://ghosterysearch.com/search?q=">ghostery:https://ghosterysearch.com/search?q=</a>
<a href="i:00izito:https://www.izito.com/search?q=">izito:https://www.izito.com/search?q=</a>
<a href="i:00duck:https://duckduckgo.com/?q=">duck:https://duckduckgo.com/?q=</a>
<a href="i:00presearch:https://presearch.com/search?q=">presearch:https://presearch.com/search?q=</a>
<a href="i:00yandex:https://yandex.com/search/?text=">yandex:https://yandex.com/search/?text=</a>
<a href="i:00searx:https://searx.be/?q=">searx:https://searx.be/?q=</a>
<a href="i:00startpage:https://startpage.com/do/search?query=">startpage:https://startpage.com/do/search?query=</a>
<a href="i:00gibiru:https://gibiru.com/results.html?q=">gibiru:https://gibiru.com/results.html?q=</a>
<a href="i:00zapmeta:https://www.zapmeta.com/search?q=">zapmeta:https://www.zapmeta.com/search?q=</a>
<a id="medicalSE">Medical</a>:
<a href="i:00medical_freedict:https://medical-dictionary.thefreedictionary.com/">medical_freedict:https://medical-dictionary.thefreedictionary.com/</a>
<a href="i:00merckmanuals:https://www.merckmanuals.com/professional/SearchResults?query=">merckmanuals:https://www.merckmanuals.com/professional/SearchResults?query=</a>
<a href="i:00openmd:https://openmd.com/search?q=">openmd:https://openmd.com/search?q=</a>
<a href="i:00radiopaedia:https://radiopaedia.org/search?q=">radiopaedia:https://radiopaedia.org/search?q=</a>
<a href="i:00medical-dict:https://medical-dictionary.com/results.php?term=">medical-dict:https://medical-dictionary.com/results.php?term=</a>
<a href="i:00ncbiBooks:https://www.ncbi.nlm.nih.gov/books/?term=">ncbiBooks:https://www.ncbi.nlm.nih.gov/books/?term=</a>
<a href="i:00healio:https://journals.healio.com/action/doSearch?AllField=">healio:https://journals.healio.com/action/doSearch?AllField=</a>
<a href="i:00pubmed:https://pubmed.ncbi.nlm.nih.gov/?term=">pubmed:https://pubmed.ncbi.nlm.nih.gov/?term=</a>
<a href="i:00pmc:https://www.ncbi.nlm.nih.gov/pmc/?term=">pmc:https://www.ncbi.nlm.nih.gov/pmc/?term=</a>
<a href="i:00Tabers:https://www.tabers.com/tabersonline/search?st=OSS&q=">Tabers:https://www.tabers.com/tabersonline/search?st=OSS&q=</a>
<a href="i:00medicinenet:https://www.medicinenet.com/%s/definition.htm">medicinenet:https://www.medicinenet.com/%s/definition.htm</a>
Torrent:
<a href="i:00aio:https://www.aiosearch.com/search/4/Torrents/">aio:https://www.aiosearch.com/search/4/Torrents/</a>
<a href="i:00academictorrents:https://academictorrents.com/browse.php?search=">academictorrents:https://academictorrents.com/browse.php?search=</a>
<a href="i:00piratebay:https://thepiratebay.org/search/%s/0/7/0">piratebay:https://thepiratebay.org/search/%s/0/7/0</a>
<a href="i:00katcr:https://katcr.to/search/">katcr:https://katcr.to/search/</a>
<a href="i:001337x:https://1337x.to/search/%s/1/">1337x:https://1337x.to/search/%s/1/</a>
<a id="scholarSE">Scholar</a>:
<a href="i:00classcentral:https://www.classcentral.com/search?q=">classcentral:https://www.classcentral.com/search?q=</a>
<a href="i:00base:https://www.base-search.net/Search/Results?lookfor=">base:https://www.base-search.net/Search/Results?lookfor=</a>
<a href="i:00science.gov:POST:fullRecord=%s:https://www.science.gov/scigov/search.html">science.gov:POST:fullRecord=%s:https://www.science.gov/scigov/search.html</a>
<a href="i:00sweetsearch:https://sweetsearch.com/search?q=">sweetsearch:https://sweetsearch.com/search?q=</a>
<a href="i:00refseek:https://www.refseek.com/search?q=">refseek:https://www.refseek.com/search?q=</a>
<a href="i:00google scholar:https://scholar.google.com/scholar?q=">google scholar:https://scholar.google.com/scholar?q=</a>
<a href="i:00bing academic:http://bing.com/academic/search?q=">bing academic:http://bing.com/academic/search?q=</a>
<a href="i:00core:https://core.ac.uk/search?q=">core:https://core.ac.uk/search?q=</a>
<a href="i:00semanticscholar:https://www.semanticscholar.org/search?sort=relevance&q=">semanticscholar:https://www.semanticscholar.org/search?sort=relevance&q=</a>
<a href="i:00xueshu:https://xueshu.baidu.com/s?wd=">xueshu:https://xueshu.baidu.com/s?wd=</a>
<a href="i:00oalib:https://www.oalib.com/search?kw=">oalib:https://www.oalib.com/search?kw=</a>
<a href="i:00connectedpapers:https://www.connectedpapers.com/search?q=">connectedpapers:https://www.connectedpapers.com/search?q=</a>
<a id="devSE">Developer</a>:
<a href="i:00devdocs:https://devdocs.io/#q=">devdocs:https://devdocs.io/#q=</a>
<a href="i:00grep.app:https://grep.app/search?q=">grep.app:https://grep.app/search?q=</a>
<a href="i:00git:https://github.com/search?type=Repositories&amp;q=">git:https://github.com/search?type=Repositories&amp;q=</a>
<a href="i:00man:http://man.cx/">man:http://man.cx/</a>
<a href="i:00code:http://searchcode.com/?q=">code:http://searchcode.com/?q=</a>
<a href="i:00symbolhound:http://symbolhound.com/?q=">symbolhound:http://symbolhound.com/?q=</a>
<a href="i:00vector:https://vector.me/search/">vector:https://vector.me/search/</a>
<a href="i:00jsdelivr:http://www.jsdelivr.com/?query=">jsdelivr:http://www.jsdelivr.com/?query=</a>
<a href="i:00greasyfork:https://greasyfork.org/en/scripts?sort=updated&q=">greasyfork:https://greasyfork.org/en/scripts?sort=updated&q=</a>
app:
<a href="i:00App store:market://search?q=">App store:market://search?q=</a>
<a id="localSE">local engines</a>(May need termux customized edition and tools like bcgnuplot etc.):
<a href="i:00bc:d:text/html:echo \'%s\'|bc -l -q:">bc:d:text/html:echo \'%s\'|bc -l -q:</a>
<a href="i:002D plot:d:image/svg+xml:gnuplot -e \'set term svg;set output; plot %s\':">2D plot:d:image/svg+xml:gnuplot -e \'set term svg;set output; plot %s\':</a>
<a href="i:003D plot:d:image/svg+xml:gnuplot -e \'set term svg;set output; splot %s\':">3D plot:d:image/svg+xml:gnuplot -e \'set term svg;set output; splot %s\':</a>
[Search engine files](../searchcat/index.html#)
More at:
[alternativeto](https://alternativeto.net/software/google-search/?feature=web-search)

328
en/search/index.html Normal file
View file

@ -0,0 +1,328 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/search/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Search engine query URLs</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Search engine query URLs
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
</ul>
<p>Clicking the following search engine configuration links (or append the link text to the file &quot;home5.search&quot;) installs search engines with <a href="../index.html#">uweb browser</a>. <a href="../ebrowserreadme/index.html#">ebrowser</a> users can change the engine name to be shorter (ex. 2 alphabets) as shortcut (click the link below and choose 'Cancel' to have a chance to modify the engine name in address bar).</p>
<p><a href="#aiSE">AI</a> <a href="#mainSE">Recommended</a> <a href="#commonSE">Common</a> <a href="#langSE">Language</a> <a href="#textbookSE">Science</a> <a href="#moreSE">More</a> <a href="#medicalSE">Medical</a> <a href="#scholarSE">Scholar</a> <a href="#devSE">Dev</a> <a href="#localSE">Local</a></p>
<p><a id="aiSE">AI</a> (Appending &quot;%250D&quot; after &quot;%s&quot; as ENTER for uweb or &quot;%0D&quot; for ebrowser):<br>
<a href="i:00gemini:https://gemini.google.com/app?q=">gemini:https://gemini.google.com/app?q=</a></p>
<p><a href="i:00gAI:https://google.com/search?udm=50&q=">gAI:https://google.com/search?udm=50&amp;q=</a></p>
<p><a href="i:00copilot:https://copilot.microsoft.com/?q=">copilot:https://copilot.microsoft.com/?q=</a></p>
<p><a href="i:00felo:https://felo.ai/search?q=">felo:https://felo.ai/search?q=</a></p>
<p><a href="i:00search.sh:https://search.sh/?q=">search.sh:https://search.sh/?q=</a></p>
<p><a href="i:00z:https://chat.z.ai/?q=">z:https://chat.z.ai/?q=</a></p>
<p><a href="i:00deepseek:i:0/js/uwebset.js:https://chat.deepseek.com#uweb=%s">deepseek:i:0/js/uwebset.js:https://chat.deepseek.com#uweb=%s</a></p>
<p><a href="i:00grok:https://grok.com/search?q=">grok:https://grok.com/search?q=</a></p>
<p><a href="i:00meta:https://www.meta.ai/search?q=">meta:https://www.meta.ai/search?q=</a></p>
<p><a href="i:00aoyo:https://aoyo.ai/search/?q=">aoyo:https://aoyo.ai/search/?q=</a></p>
<p><a href="i:00monica.im:https://monica.im/home/chat/deepseek-r1/deepseek_reasoner?q=">monica.im:https://monica.im/home/chat/deepseek-r1/deepseek_reasoner?q=</a></p>
<p><a href="i:00monica:https://monica.so/answers?q=">monica:https://monica.so/answers?q=</a></p>
<p><a href="i:00giz:https://app.giz.ai/assistant?mode=chat&prompt=">giz:https://app.giz.ai/assistant?mode=chat&amp;prompt=</a></p>
<p><a href="i:00longcat:i:0/js/uweb2edit.js:https://longcat.chat/#uweb=%3Cp%3E%s%3C/p%3E">longcat:i:0/js/uweb2edit.js:https://longcat.chat/#uweb=%3Cp%3E%s%3C/p%3E</a></p>
<p><a href="i:00lmarena:i:0/js/uwebset.js:https://lmarena.ai/#uweb=%s">lmarena:i:0/js/uwebset.js:https://lmarena.ai/#uweb=%s</a></p>
<p><a href="i:00miromind:i:0/js/uwebset.js:https://dr.miromind.ai/#uweb=%s">miromind:i:0/js/uwebset.js:https://dr.miromind.ai/#uweb=%s</a></p>
<p><a href="i:00txyz:i:0/js/uwebset.js:https://app.txyz.ai#uweb=%s">txyz:i:0/js/uwebset.js:https://app.txyz.ai#uweb=%s</a></p>
<p><a href="i:00komo:i:0/js/uwebset.js:https://komo.ai#uweb=%s">komo:i:0/js/uwebset.js:https://komo.ai#uweb=%s</a></p>
<p><a href="i:00solab:i:0/js/uwebset.js:https://www.solab.ai#uweb=%s">solab:i:0/js/uwebset.js:https://www.solab.ai#uweb=%s</a></p>
<p><a href="i:00isou:https://isou.chat/search?q=">isou:https://isou.chat/search?q=</a></p>
<p><a href="i:00bagoodex:https://bagoodex.io/search?q=">bagoodex:https://bagoodex.io/search?q=</a></p>
<p><a href="i:00andi:https://andisearch.com/?q=">andi:https://andisearch.com/?q=</a></p>
<p><a href="i:00scira:https://scira.ai/?q=">scira:https://scira.ai/?q=</a></p>
<p><a href="i:00gigabrain:https://thegigabrain.com/search/">gigabrain:https://thegigabrain.com/search/</a></p>
<p><a href="i:00liner:https://getliner.com?q=">liner:https://getliner.com?q=</a></p>
<p><a href="i:00lenso:https://lenso.ai/en/search-by-text?type=relatedText&desc=">lenso:https://lenso.ai/en/search-by-text?type=relatedText&amp;desc=</a></p>
<p><a href="i:00phind:https://www.phind.com/search?q=">phind:https://www.phind.com/search?q=</a></p>
<p><a href="i:00xanswer:https://www.xanswer.com/search?q=">xanswer:https://www.xanswer.com/search?q=</a></p>
<p><a href="i:00mistral:https://chat.mistral.ai/chat?q=">mistral:https://chat.mistral.ai/chat?q=</a></p>
<p><a href="i:00mindfulq:https://www.mindfulq.com/s?q=">mindfulq:https://www.mindfulq.com/s?q=</a></p>
<p><a href="i:00searchgptool:https://searchgptool.ai/search?q=">searchgptool:https://searchgptool.ai/search?q=</a></p>
<p><a href="i:00iask:https://iask.ai/?q=">iask:https://iask.ai/?q=</a></p>
<p><a href="i:00perplexity:https://www.perplexity.ai/?q=">perplexity:https://www.perplexity.ai/?q=</a></p>
<p><a href="i:00youChat:https://you.com/search?tbm=youchat&q=">youChat:https://you.com/search?tbm=youchat&amp;q=</a></p>
<p><a href="i:00youWrite:https://you.com/search?tbm=youwrite&q=">youWrite:https://you.com/search?tbm=youwrite&amp;q=</a></p>
<p><a href="i:00youImagine:https://you.com/search?tbm=imagine&q=">youImagine:https://you.com/search?tbm=imagine&amp;q=</a></p>
<p><a href="i:00you:https://you.com/search?q=">you:https://you.com/search?q=</a></p>
<p><a href="i:00xdash:https://www.xdash.ai/search?q=">xdash:https://www.xdash.ai/search?q=</a></p>
<p><a href="i:00medisearch:https://medisearch.io/results/">medisearch:https://medisearch.io/results/</a></p>
<p><a href="i:00consensus:https://consensus.app/results/?synthesize=on&q=">consensus:https://consensus.app/results/?synthesize=on&amp;q=</a></p>
<p><a href="i:00yoursearch:https://app.yoursearch.ai/?q=">yoursearch:https://app.yoursearch.ai/?q=</a></p>
<p><a href="i:00awesomerepo:https://www.awesome-repositories.com/s/results-with-ai/">awesomerepo:https://www.awesome-repositories.com/s/results-with-ai/</a></p>
<p><a href="i:00searchGPT:https://chatgpt.com?hints=search&q=">searchGPT:https://chatgpt.com?hints=search&amp;q=</a></p>
<p><a href="i:00claude:https://claude.ai/new?q=">claude:https://claude.ai/new?q=</a></p>
<p><a href="i:00floatsearch:i:0/js/uweb2ta.js:https://floatsearch.ai#uweb=%s">floatsearch:i:0/js/uweb2ta.js:https://floatsearch.ai#uweb=%s</a></p>
<p><a href="i:00morphic:i:0/js/uweb2ta.js:https://www.morphic.sh#uweb=%s">morphic:i:0/js/uweb2ta.js:https://www.morphic.sh#uweb=%s</a></p>
<p><a href="i:00lambda:i:0/js/uweb2ta.js:https://lambda.chat/chatui/#uweb=%s">lambda:i:0/js/uweb2ta.js:https://lambda.chat/chatui/#uweb=%s</a></p>
<p><a href="i:00blackbox:https://www.blackbox.ai/?q=">blackbox:https://www.blackbox.ai/?q=</a></p>
<p><a href="i:00EBAI:i:0/js/uweb2input.js:https://www.britannica.com/chatbot#uweb=%s">EBAI:i:0/js/uweb2input.js:https://www.britannica.com/chatbot#uweb=%s</a></p>
<p><a href="i:00graphthem:i:0/js/uweb2input.js:https://graphthem.com/search?#uweb=%s">graphthem:i:0/js/uweb2input.js:https://graphthem.com/search?#uweb=%s</a></p>
<p><a href="i:00correkt:i:0/js/uweb2ta.js:https://correkt.ai#uweb=%s">correkt:i:0/js/uweb2ta.js:https://correkt.ai#uweb=%s</a></p>
<p><a href="i:00devv:i:0/js/uweb2edit.js:https://devv.ai#uweb=%3Cp%3E%s%3C/p%3E">devv:i:0/js/uweb2edit.js:https://devv.ai#uweb=%3Cp%3E%s%3C/p%3E</a></p>
<p><a href="i:00duck.ai:https://duckduckgo.com?ia=chat&q=">duck.ai:https://duckduckgo.com?ia=chat&amp;q=</a></p>
<p><a href="i:00lepton:i:0/js/uweb2input.js:https://search.lepton.run/#uweb=%s">lepton:i:0/js/uweb2input.js:https://search.lepton.run/#uweb=%s</a></p>
<p><a href="i:00stepfun:i:0/js/uwebset.js:https://www.stepfun.com/chats/new#uweb=%s">stepfun:i:0/js/uwebset.js:https://www.stepfun.com/chats/new#uweb=%s</a></p>
<p><a href="i:00poe:https://poe.com/DeepSeek-R1?q=">poe:https://poe.com/DeepSeek-R1?q=</a></p>
<p><a href="i:00t3:https://www.t3.chat/new?q=">t3:https://www.t3.chat/new?q=</a></p>
<p>AI (The search tab must not be in background. Appending &quot;%250D&quot; after &quot;%s&quot; as ENTER for uweb or &quot;%0D&quot; for ebrowser.)<br>
<a href="i:00hika:i:0/js/uweb2input2.js:https://hika.fyi/search#uweb=%s">hika:i:0/js/uweb2input2.js:https://hika.fyi/search#uweb=%s</a></p>
<p><a id="mainSE">Recommended engines</a><br>
<a href="i:00Engines:i:40%s_00">Engines:i:40%s_00</a></p>
<p><a href="i:00bing image:http://bing.com/images/search?q=">bing image:http://bing.com/images/search?q=</a></p>
<p><a href="i:00google image:http://www.google.com/images?as_q=">google image:http://www.google.com/images?as_q=</a></p>
<p><a href="i:00flickr:http://www.flickr.com/photos/tags/">flickr:http://www.flickr.com/photos/tags/</a></p>
<p><a href="i:00Yandex image:https://yandex.com/images/search?text=">Yandex image:https://yandex.com/images/search?text=</a></p>
<p><a href="i:00wiki:https://en.wikipedia.org/wiki/Special:Search?search=">wiki:https://en.wikipedia.org/wiki/Special:Search?search=</a></p>
<p><a href="i:00wikipedia:http://en.wikipedia.org/?search=">wikipedia:http://en.wikipedia.org/?search=</a></p>
<p><a href="i:00wikifull:http://en.wikipedia.org/wiki/Special:Search?fulltext=Search&search=">wikifull:http://en.wikipedia.org/wiki/Special:Search?fulltext=Search&amp;search=</a></p>
<p><a href="i:00Youtube:https://www.youtube.com/results?search_query=">Youtube:https://www.youtube.com/results?search_query=</a></p>
<p><a href="i:00eBay:https://www.ebay.com/sch/i.html?_nkw=">eBay:https://www.ebay.com/sch/i.html?_nkw=</a></p>
<p><a href="i:00Quora:https://www.quora.com/search?q=">Quora:https://www.quora.com/search?q=</a></p>
<p><a href="i:00Pinterest:https://www.pinterest.com/search/pins/?q=">Pinterest:https://www.pinterest.com/search/pins/?q=</a></p>
<p><a href="i:00LinkedIn:https://www.linkedin.com/search/results/all/?keywords=">LinkedIn:https://www.linkedin.com/search/results/all/?keywords=</a></p>
<p><a href="i:00Netflix:https://www.netflix.com/search?q=">Netflix:https://www.netflix.com/search?q=</a></p>
<p><a href="i:00Spotify:https://open.spotify.com/search/">Spotify:https://open.spotify.com/search/</a></p>
<p><a href="i:00Medium:https://medium.com/search?q=">Medium:https://medium.com/search?q=</a></p>
<p><a href="i:00TripAdvisor:https://www.tripadvisor.com/Search?q=">TripAdvisor:https://www.tripadvisor.com/Search?q=</a></p>
<p><a href="i:00incaption:https://incaptions.com/">incaption:https://incaptions.com/</a></p>
<p><a href="i:00answer:http://mobile.answers.com/">answer:http://mobile.answers.com/</a></p>
<p><a href="i:00twitter:https://twitter.com/search?q=">twitter:https://twitter.com/search?q=</a></p>
<p><a href="i:00Facebook:https://www.facebook.com/search/str/%s/keywords_search">Facebook:https://www.facebook.com/search/str/%s/keywords_search</a></p>
<p><a href="i:00Instagram:https://www.instagram.com/explore/tags/%s/">Instagram:https://www.instagram.com/explore/tags/%s/</a></p>
<p><a href="i:00social-search:https://www.social-searcher.com/social-buzz/?q5=">social-search:https://www.social-searcher.com/social-buzz/?q5=</a></p>
<p><a href="i:00reddit:http://reddit.com/search?q=">reddit:http://reddit.com/search?q=</a></p>
<p><a href="i:00boardreader:https://boardreader.com/s/%s.html">boardreader:https://boardreader.com/s/%s.html</a></p>
<p><a href="i:00bingvideo:https://www.bing.com/videos/search?q=">bingvideo:https://www.bing.com/videos/search?q=</a></p>
<p><a href="i:00vsearch:https://www.vsearch.me/s?q=">vsearch:https://www.vsearch.me/s?q=</a></p>
<p><a href="i:00crowdview:https://crowdview.ai/search?q=">crowdview:https://crowdview.ai/search?q=</a></p>
<p><a href="i:00forumscout:https://forumscout.app/search?q=">forumscout:https://forumscout.app/search?q=</a></p>
<p><a href="i:00groups:http://groups.google.com/groups/search?q=">groups:http://groups.google.com/groups/search?q=</a></p>
<p><a href="i:00wolfram:https://www.wolframalpha.com/input/?i=">wolfram:https://www.wolframalpha.com/input/?i=</a></p>
<p><a href="i:00fxsolver:https://www.fxsolver.com/browse/?q=">fxsolver:https://www.fxsolver.com/browse/?q=</a></p>
<p><a href="i:00book_google:https://google.com/search?q=%22parent+directory%22+pdf+OR+epub+OR+DjVU+OR+xps+%22%s%22+-html+-htm+-shtml+-phtml+-php+-buy+-aspx+-jsp+-asp+-cgi+-pdf+-ftp+-unknownsecret&num=100&filter=0">book_google:https://google.com/search?q=%22parent+directory%22+pdf+OR+epub+OR+DjVU+OR+xps+%22%s%22+-html+-htm+-shtml+-phtml+-php+-buy+-aspx+-jsp+-asp+-cgi+-pdf+-ftp+-unknownsecret&amp;num=100&amp;filter=0</a></p>
<p><a href="i:00annas-archive:https://annas-archive.org/search?q=">annas-archive:https://annas-archive.org/search?q=</a></p>
<p><a href="i:00libgen:http://gen.lib.rus.ec/search.php?req=">libgen:http://gen.lib.rus.ec/search.php?req=</a></p>
<p><a href="i:00google_file:https://google.com/search?q=intitle:index.of+%22parent+directory%22+">google_file:https://google.com/search?q=intitle:index.of+%22parent+directory%22+</a></p>
<p><a href="i:00apkcombo:https://apkcombo.com/search/">apkcombo:https://apkcombo.com/search/</a></p>
<p>Note: &quot;Engines&quot; needs file &quot;engine.search&quot;whose format is same as &quot;home.search&quot; except that the keyword part of url must be denoted with &quot;%s&quot;. Pressing the right arrow button on the search result page will automatically query with next engine in the file.</p>
<p><a id="commonSE">Common engines</a>:<br>
<a href="i:00google:https://google.com/search?q=">google:https://google.com/search?q=</a></p>
<p><a href="i:00udm14:https://google.com/search?udm=14&q=">udm14:https://google.com/search?udm=14&amp;q=</a></p>
<p><a href="i:00bing:http://www.bing.com/search?q=">bing:http://www.bing.com/search?q=</a></p>
<p><a href="i:00exa:https://exa.ai/search?c=all&q=">exa:https://exa.ai/search?c=all&amp;q=</a></p>
<p><a href="i:00togoda:https://togoda.com/search?query=">togoda:https://togoda.com/search?query=</a></p>
<p><a href="i:00marginalia:https://search.marginalia.nu/search?query=">marginalia:https://search.marginalia.nu/search?query=</a></p>
<p><a href="i:00mojeek:https://www.mojeek.com/search?q=">mojeek:https://www.mojeek.com/search?q=</a></p>
<p><a href="i:00rightdao:https://rightdao.com/search?q=">rightdao:https://rightdao.com/search?q=</a></p>
<p><a href="i:00yep:https://yep.com/web?q=">yep:https://yep.com/web?q=</a></p>
<p><a href="i:00seznam:https://search.seznam.cz/?q=">seznam:https://search.seznam.cz/?q=</a></p>
<p><a href="i:00metager:https://metager.org/meta/meta.ger3?eingabe=">metager:https://metager.org/meta/meta.ger3?eingabe=</a></p>
<p><a href="i:00brave:https://search.brave.com/search?q=">brave:https://search.brave.com/search?q=</a></p>
<p><a href="i:00ellpedia:https://en.ellpedia.com/search?q=">ellpedia:https://en.ellpedia.com/search?q=</a></p>
<p><a href="i:00gemini:https://portal.mozz.us/gemini/geminispace.info/search%3F">gemini:https://portal.mozz.us/gemini/geminispace.info/search%3F</a></p>
<p><a href="i:00waldo:https://waldo.com/search?q=">waldo:https://waldo.com/search?q=</a></p>
<p><a href="i:00xda:https://www.xda-developers.com/search/">xda:https://www.xda-developers.com/search/</a></p>
<p><a href="i:00pix:https://www.google.com/search?tbm=isch&q=">pix:https://www.google.com/search?tbm=isch&amp;q=</a></p>
<p><a href="i:00youtube:https://youtube.com/results?search_query=">youtube:https://youtube.com/results?search_query=</a></p>
<p><a href="i:00news:https://news.search.yahoo.com/search/news?p=">news:https://news.search.yahoo.com/search/news?p=</a></p>
<p><a href="i:00stock:https://finance.yahoo.com/quote/">stock:https://finance.yahoo.com/quote/</a></p>
<p><a href="i:00amazon:https://www.amazon.com/s/?field-keywords=">amazon:https://www.amazon.com/s/?field-keywords=</a></p>
<p><a href="i:00weather:https://www.wunderground.com/cgi-bin/findweather/getForecast?query=">weather:https://www.wunderground.com/cgi-bin/findweather/getForecast?query=</a></p>
<p><a href="i:00IMDB:https://www.imdb.com/find?q=">IMDB:https://www.imdb.com/find?q=</a></p>
<p><a href="i:00film review:https://www.rottentomatoes.com/search/?search=">film review:https://www.rottentomatoes.com/search/?search=</a></p>
<p><a href="i:00goodreads:https://www.goodreads.com/search?query=">goodreads:https://www.goodreads.com/search?query=</a></p>
<p><a href="i:00audible:http://www.audible.com/search?sort=review-rank&advsearchKeywords=">audible:http://www.audible.com/search?sort=review-rank&amp;advsearchKeywords=</a></p>
<p><a href="i:00audiobay:http://audiobookbay.se/?s=">audiobay:http://audiobookbay.se/?s=</a></p>
<p><a href="i:00telegramsearcher:https://telegramsearcher.com/search?q=">telegramsearcher:https://telegramsearcher.com/search?q=</a></p>
<p><a href="i:00lyzem:https://lyzem.com/search?q=">lyzem:https://lyzem.com/search?q=</a></p>
<p><a id="langSE">language</a>:<br>
<a href="i:00webster1913:https://www.websters1913.com/words/">webster1913:https://www.websters1913.com/words/</a></p>
<p><a href="i:00merriam-webster:https://www.merriam-webster.com/dictionary/">merriam-webster:https://www.merriam-webster.com/dictionary/</a></p>
<p><a href="i:00dictionary:https://www.dictionary.com/browse/">dictionary:https://www.dictionary.com/browse/</a></p>
<p><a href="i:00freedictionary:https://www.thefreedictionary.com/">freedictionary:https://www.thefreedictionary.com/</a></p>
<p><a href="i:00legal_fd:https://legal-dictionary.thefreedictionary.com/">legal_fd:https://legal-dictionary.thefreedictionary.com/</a></p>
<p><a href="i:00finance_fd:https://financial-dictionary.thefreedictionary.com/">finance_fd:https://financial-dictionary.thefreedictionary.com/</a></p>
<p><a href="i:00wikipedia_fd:https://encyclopedia.thefreedictionary.com/">wikipedia_fd:https://encyclopedia.thefreedictionary.com/</a></p>
<p><a href="i:00encyclopedia_fd:https://encyclopedia2.thefreedictionary.com/">encyclopedia_fd:https://encyclopedia2.thefreedictionary.com/</a></p>
<p><a href="i:00wordreference:https://www.wordreference.com/definition/">wordreference:https://www.wordreference.com/definition/</a></p>
<p><a href="i:00vocabulary:https://www.vocabulary.com/dictionary/">vocabulary:https://www.vocabulary.com/dictionary/</a></p>
<p><a href="i:00etymology:https://www.etymonline.com/search?q=">etymology:https://www.etymonline.com/search?q=</a></p>
<p><a href="i:00powerthesaurus:https://www.powerthesaurus.org/%s/synonyms">powerthesaurus:https://www.powerthesaurus.org/%s/synonyms</a></p>
<p><a href="i:00macmillanthesaurus:https://www.macmillanthesaurus.com/search/?auto=complete&q=">macmillanthesaurus:https://www.macmillanthesaurus.com/search/?auto=complete&amp;q=</a></p>
<p><a href="i:00ludwig:https://ludwig.guru/s/">ludwig:https://ludwig.guru/s/</a></p>
<p><a href="i:00webster:https://www.merriam-webster.com/dictionary/">webster:https://www.merriam-webster.com/dictionary/</a></p>
<p><a href="i:00googledict:http://googledictionary.freecollocation.com/meaning?word=">googledict:http://googledictionary.freecollocation.com/meaning?word=</a></p>
<p><a href="i:00freetts_ru:https://freetts.com/Home/PlayAudio?Language=ru-RU&Voice=ru-RU-Standard-A&id=undefined&type=0&TextMessage=">freetts_ru:https://freetts.com/Home/PlayAudio?Language=ru-RU&amp;Voice=ru-RU-Standard-A&amp;id=undefined&amp;type=0&amp;TextMessage=</a></p>
<p><a href="i:00freetts_ar:https://freetts.com/Home/PlayAudio?Language=ar-XA&Voice=ar-XA-Standard-A&id=undefined&type=0&TextMessage=">freetts_ar:https://freetts.com/Home/PlayAudio?Language=ar-XA&amp;Voice=ar-XA-Standard-A&amp;id=undefined&amp;type=0&amp;TextMessage=</a></p>
<p><a id="textbookSE">Science</a>:<br>
<a href="i:00britannica:https://www.britannica.com/search?query=">britannica:https://www.britannica.com/search?query=</a></p>
<p><a href="i:00mathRef:https://reference.wolfram.com/search/?q=">mathRef:https://reference.wolfram.com/search/?q=</a></p>
<p><a href="i:00mathSE:https://math.stackexchange.com/search?q=">mathSE:https://math.stackexchange.com/search?q=</a></p>
<p><a href="i:00phySE:https://physics.stackexchange.com/search?q=">phySE:https://physics.stackexchange.com/search?q=</a></p>
<p><a href="i:00physicsForum:https://www.physicsforums.com/search/2195918/?q=">physicsForum:https://www.physicsforums.com/search/2195918/?q=</a></p>
<p><a href="i:00pubchem SMILES:https://pubchem.ncbi.nlm.nih.gov/#input_type=smiles&query=">pubchem SMILES:https://pubchem.ncbi.nlm.nih.gov/#input_type=smiles&amp;query=</a></p>
<p><a href="i:00pubchem:https://pubchem.ncbi.nlm.nih.gov/#query=">pubchem:https://pubchem.ncbi.nlm.nih.gov/#query=</a></p>
<p><a href="i:00chemSE:https://chemistry.stackexchange.com/search?q=">chemSE:https://chemistry.stackexchange.com/search?q=</a></p>
<p><a href="i:00chem:https://www.ncbi.nlm.nih.gov/pccompound?term=">chem:https://www.ncbi.nlm.nih.gov/pccompound?term=</a></p>
<p><a href="i:00proofwiki:https://proofwiki.org/w/index.php?search=">proofwiki:https://proofwiki.org/w/index.php?search=</a></p>
<p><a href="i:00physics:http://www.physics.org/explore-results-all.asp?q=">physics:http://www.physics.org/explore-results-all.asp?q=</a></p>
<p><a href="i:00biology:https://www.biologyonline.com/dictionary/">biology:https://www.biologyonline.com/dictionary/</a></p>
<p><a href="i:00nist chem:https://webbook.nist.gov/cgi/cbook.cgi?Formula=">nist chem:https://webbook.nist.gov/cgi/cbook.cgi?Formula=</a></p>
<p><a href="i:00chemiday:https://chemiday.com/search/?lang=en&q=">chemiday:https://chemiday.com/search/?lang=en&amp;q=</a></p>
<p><a href="i:00chem.libretexts:https://chem.libretexts.org/Special:Search?q=">chem.libretexts:https://chem.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00bio.libretexts:https://bio.libretexts.org/Special:Search?q=">bio.libretexts:https://bio.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00phys.libretexts:https://phys.libretexts.org/Special:Search?q=">phys.libretexts:https://phys.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00med.libretexts:https://med.libretexts.org/Special:Search?q=">med.libretexts:https://med.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00math.libretexts:https://math.libretexts.org/Special:Search?q=">math.libretexts:https://math.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00stats.libretexts:https://stats.libretexts.org/Special:Search?q=">stats.libretexts:https://stats.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00geo.libretexts:https://geo.libretexts.org/Special:Search?q=">geo.libretexts:https://geo.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00eng.libretexts:https://eng.libretexts.org/Special:Search?q=">eng.libretexts:https://eng.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00biz.libretexts:https://biz.libretexts.org/Special:Search?q=">biz.libretexts:https://biz.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00human.libretexts:https://human.libretexts.org/Special:Search?q=">human.libretexts:https://human.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00socialsci.libretexts:https://socialsci.libretexts.org/Special:Search?q=">socialsci.libretexts:https://socialsci.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00workforce.libretexts:https://workforce.libretexts.org/Special:Search?q=">workforce.libretexts:https://workforce.libretexts.org/Special:Search?q=</a></p>
<p><a id="moreSE">More engines</a>:<br>
<a href="i:00oscobo:https://www.oscobo.com/search.php?q=">oscobo:https://www.oscobo.com/search.php?q=</a></p>
<p><a href="i:00lycos:https://search.lycos.com/web/?q=">lycos:https://search.lycos.com/web/?q=</a></p>
<p><a href="i:00technorati:http://technorati.com/search/index.php?q=">technorati:http://technorati.com/search/index.php?q=</a></p>
<p><a href="i:00qwant:https://lite.qwant.com/?q=">qwant:https://lite.qwant.com/?q=</a></p>
<p><a href="i:00swisscows:https://swisscows.com/web?query=">swisscows:https://swisscows.com/web?query=</a></p>
<p><a href="i:00ecosia:https://www.ecosia.org/search?q=">ecosia:https://www.ecosia.org/search?q=</a></p>
<p><a href="i:00ghostery:https://ghosterysearch.com/search?q=">ghostery:https://ghosterysearch.com/search?q=</a></p>
<p><a href="i:00izito:https://www.izito.com/search?q=">izito:https://www.izito.com/search?q=</a></p>
<p><a href="i:00duck:https://duckduckgo.com/?q=">duck:https://duckduckgo.com/?q=</a></p>
<p><a href="i:00presearch:https://presearch.com/search?q=">presearch:https://presearch.com/search?q=</a></p>
<p><a href="i:00yandex:https://yandex.com/search/?text=">yandex:https://yandex.com/search/?text=</a></p>
<p><a href="i:00searx:https://searx.be/?q=">searx:https://searx.be/?q=</a></p>
<p><a href="i:00startpage:https://startpage.com/do/search?query=">startpage:https://startpage.com/do/search?query=</a></p>
<p><a href="i:00gibiru:https://gibiru.com/results.html?q=">gibiru:https://gibiru.com/results.html?q=</a></p>
<p><a href="i:00zapmeta:https://www.zapmeta.com/search?q=">zapmeta:https://www.zapmeta.com/search?q=</a></p>
<p><a id="medicalSE">Medical</a>:<br>
<a href="i:00medical_freedict:https://medical-dictionary.thefreedictionary.com/">medical_freedict:https://medical-dictionary.thefreedictionary.com/</a></p>
<p><a href="i:00merckmanuals:https://www.merckmanuals.com/professional/SearchResults?query=">merckmanuals:https://www.merckmanuals.com/professional/SearchResults?query=</a></p>
<p><a href="i:00openmd:https://openmd.com/search?q=">openmd:https://openmd.com/search?q=</a></p>
<p><a href="i:00radiopaedia:https://radiopaedia.org/search?q=">radiopaedia:https://radiopaedia.org/search?q=</a></p>
<p><a href="i:00medical-dict:https://medical-dictionary.com/results.php?term=">medical-dict:https://medical-dictionary.com/results.php?term=</a></p>
<p><a href="i:00ncbiBooks:https://www.ncbi.nlm.nih.gov/books/?term=">ncbiBooks:https://www.ncbi.nlm.nih.gov/books/?term=</a></p>
<p><a href="i:00healio:https://journals.healio.com/action/doSearch?AllField=">healio:https://journals.healio.com/action/doSearch?AllField=</a></p>
<p><a href="i:00pubmed:https://pubmed.ncbi.nlm.nih.gov/?term=">pubmed:https://pubmed.ncbi.nlm.nih.gov/?term=</a></p>
<p><a href="i:00pmc:https://www.ncbi.nlm.nih.gov/pmc/?term=">pmc:https://www.ncbi.nlm.nih.gov/pmc/?term=</a></p>
<p><a href="i:00Tabers:https://www.tabers.com/tabersonline/search?st=OSS&q=">Tabers:https://www.tabers.com/tabersonline/search?st=OSS&amp;q=</a></p>
<p><a href="i:00medicinenet:https://www.medicinenet.com/%s/definition.htm">medicinenet:https://www.medicinenet.com/%s/definition.htm</a></p>
<p>Torrent:<br>
<a href="i:00aio:https://www.aiosearch.com/search/4/Torrents/">aio:https://www.aiosearch.com/search/4/Torrents/</a></p>
<p><a href="i:00academictorrents:https://academictorrents.com/browse.php?search=">academictorrents:https://academictorrents.com/browse.php?search=</a></p>
<p><a href="i:00piratebay:https://thepiratebay.org/search/%s/0/7/0">piratebay:https://thepiratebay.org/search/%s/0/7/0</a></p>
<p><a href="i:00katcr:https://katcr.to/search/">katcr:https://katcr.to/search/</a></p>
<p><a href="i:001337x:https://1337x.to/search/%s/1/">1337x:https://1337x.to/search/%s/1/</a></p>
<p><a id="scholarSE">Scholar</a>:<br>
<a href="i:00classcentral:https://www.classcentral.com/search?q=">classcentral:https://www.classcentral.com/search?q=</a></p>
<p><a href="i:00base:https://www.base-search.net/Search/Results?lookfor=">base:https://www.base-search.net/Search/Results?lookfor=</a></p>
<p><a href="i:00science.gov:POST:fullRecord=%s:https://www.science.gov/scigov/search.html">science.gov:POST:fullRecord=%s:https://www.science.gov/scigov/search.html</a></p>
<p><a href="i:00sweetsearch:https://sweetsearch.com/search?q=">sweetsearch:https://sweetsearch.com/search?q=</a></p>
<p><a href="i:00refseek:https://www.refseek.com/search?q=">refseek:https://www.refseek.com/search?q=</a></p>
<p><a href="i:00google scholar:https://scholar.google.com/scholar?q=">google scholar:https://scholar.google.com/scholar?q=</a></p>
<p><a href="i:00bing academic:http://bing.com/academic/search?q=">bing academic:http://bing.com/academic/search?q=</a></p>
<p><a href="i:00core:https://core.ac.uk/search?q=">core:https://core.ac.uk/search?q=</a></p>
<p><a href="i:00semanticscholar:https://www.semanticscholar.org/search?sort=relevance&q=">semanticscholar:https://www.semanticscholar.org/search?sort=relevance&amp;q=</a></p>
<p><a href="i:00xueshu:https://xueshu.baidu.com/s?wd=">xueshu:https://xueshu.baidu.com/s?wd=</a></p>
<p><a href="i:00oalib:https://www.oalib.com/search?kw=">oalib:https://www.oalib.com/search?kw=</a></p>
<p><a href="i:00connectedpapers:https://www.connectedpapers.com/search?q=">connectedpapers:https://www.connectedpapers.com/search?q=</a></p>
<p><a id="devSE">Developer</a>:<br>
<a href="i:00devdocs:https://devdocs.io/#q=">devdocs:https://devdocs.io/#q=</a></p>
<p><a href="i:00grep.app:https://grep.app/search?q=">grep.app:https://grep.app/search?q=</a></p>
<p><a href="i:00git:https://github.com/search?type=Repositories&amp;q=">git:https://github.com/search?type=Repositories&amp;q=</a></p>
<p><a href="i:00man:http://man.cx/">man:http://man.cx/</a></p>
<p><a href="i:00code:http://searchcode.com/?q=">code:http://searchcode.com/?q=</a></p>
<p><a href="i:00symbolhound:http://symbolhound.com/?q=">symbolhound:http://symbolhound.com/?q=</a></p>
<p><a href="i:00vector:https://vector.me/search/">vector:https://vector.me/search/</a></p>
<p><a href="i:00jsdelivr:http://www.jsdelivr.com/?query=">jsdelivr:http://www.jsdelivr.com/?query=</a></p>
<p><a href="i:00greasyfork:https://greasyfork.org/en/scripts?sort=updated&q=">greasyfork:https://greasyfork.org/en/scripts?sort=updated&amp;q=</a></p>
<p>app:<br>
<a href="i:00App store:market://search?q=">App store:market://search?q=</a></p>
<p><a id="localSE">local engines</a>(May need termux customized edition and tools like bcgnuplot etc.):<br>
<a href="i:00bc:d:text/html:echo \'%s\'|bc -l -q:">bc:d:text/html:echo '%s'|bc -l -q:</a></p>
<p><a href="i:002D plot:d:image/svg+xml:gnuplot -e \'set term svg;set output; plot %s\':">2D plot:d:image/svg+xml:gnuplot -e 'set term svg;set output; plot %s':</a></p>
<p><a href="i:003D plot:d:image/svg+xml:gnuplot -e \'set term svg;set output; splot %s\':">3D plot:d:image/svg+xml:gnuplot -e 'set term svg;set output; splot %s':</a></p>
<p><a href="../searchcat/index.html#">Search engine files</a></p>
<p>More at:<br>
<a href="https://alternativeto.net/software/google-search/?feature=web-search">alternativeto</a></p>
</div>
<p>Last Modified: 5 December 2025<br>
add notes for &#39;%250D&#39;<br>
<pre>Add AI engines
</pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

104
en/searchcat/index.html Normal file
View file

@ -0,0 +1,104 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/searchcat/" />
<link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Search engine files</title>
<script>
function findLang(){
let href = location.href;
for(let i=href.length-1;i>0;i--){
if('/'==href.charAt(i) && '/'==href.charAt(i-3))
return i;
}
return 0;
}
function nav2(page){
let i = findLang();
location.href = location.href.substring(0,i+1)+page;
}
function nav2Lang(lang){
let i = findLang();
let href = location.href;
location.href = location.href.substring(0,i-2)+lang+location.href.substring(i);
}
</script>
</head>
<body>
<header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
<nav>
</nav>
</header>
<br />
<div class="container">
<h1 class="title">Search engine files
<br>
<span class="subtitle"></span>
</h1>
<ul class="tags">
<li><a href="../tags/search-engine/index.html#">search-engine</a> </li>
</ul>
<p>Search engine file names have &quot;.search&quot; as postfix. When they are clicked, the associated bookmark files with postfix &quot;.search.html&quot; would be appended. Ex: the associated bookmark for &quot;foo.search&quot; is &quot;foo.search.html&quot;.</p>
<p>Any &quot;.search&quot; file can be opened as search engine file, each line of which has one of the following formats:<br>
[Engine name]:[url without '%s' inside]<br>
[Engine name]:[url with '%s' as keyword]<br>
[Engine name]:POST:[post params with '%s' as keyword]:[url]<br>
[Engine name]:[Extra request headers]:[post params with '%s' as keyword]:[url]</p>
<ul>
<li>[Extra request headers] Ex. &quot;X-Forwarded-For;8.8.8.8&quot;</li>
<li>when [post params] is empty, the url should have '%s' as keyword.</li>
</ul>
<p>Limitations (they are here for performance reasons):</p>
<ul>
<li>The first engine in the file must be url without or with '%s'.</li>
<li>Internal scheme engine urls (such as i:, d:, c:) must have '%s', since '%s' format is more general (only type 2 is allowed, since POST makes no sense for internal schemes).</li>
</ul>
<h4 id="local-engines">Local engines</h4>
<p>c:[command line with '%s' as keyword]<br>
d:mimetype:[command line with '%s' as keyword]:[base url for external resources]</p>
</div>
<p>Last Modified: 9 April 2025<br>
fix broken links<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body>
</html>

View file

@ -0,0 +1 @@
(function(){let d=document;let t=d.location.hash.substring(1);if(!t)return;t=decodeURI(t);let ta;function setV(){if(ta.value)return;ta.value=t;ta.dispatchEvent(new InputEvent('input'));setTimeout(()=>{setV()},400)}function waitTextarea(){ta=d.querySelector('textarea');if(ta){setV();return;}setTimeout(()=>{waitTextarea();},400);}waitTextarea();})()

View file

@ -0,0 +1,99 @@
<head>
<base>
<script src="https://fastly.jsdelivr.net/npm/marked@3.0.7/marked.min.js"></script>
<script>
function absFile(url) {
this.name=url;
this.slice = async(offset, length) =>{
let resp = new Promise(function (resolve, reject) {
let r=new XMLHttpRequest;
r.onload=function(){
if (r.status == 200)
resolve(r.response);
else
reject(r.statusText);
}
r.onerror = () => reject(r.statusText);
r.open("GET",this.name,!0);
r.setRequestHeader('range', 'bytes=' + offset + '-' + ( offset + length -1).toString());
r.send(null);});
return await resp.arrayBuffer();
}
}
marked.setOptions({
gfm: true,
});
var file;
var blocksize = 20480;
function loadSlice(){
function render(u8array){
document.body.innerHTML = marked(new TextDecoder().decode(u8array));
scroll(0,0);
}
function setPageUrl(pageurl){
let a = document.createElement('a');
a.href = "i:5c"+pageurl;
a.click();
}
var page = 1;
var extrasize = blocksize; //extrasize should <= blocksize
let lhash = location.hash;
if(lhash){
if("p"!==lhash.charAt(1)){//#offset=&[len]
let iAmpersand = lhash.indexOf('&',8);
let offset = parseInt(lhash.substring(8,iAmpersand));
let len = parseInt(lhash.substring(iAmpersand+1));
{//update urlInc() url
let href = location.href;
let iHash = href.indexOf('#');
href=href.substring(0,iHash)+"#page="+Math.floor((offset+len)/blocksize);
setPageUrl(href);
}
file.slice(offset,len).then((buffer)=>{
let u8 = new Uint8Array(buffer);
render(u8);
});
return;
}
//#page=
page = parseInt(lhash.substring(6));
}else
setPageUrl(location.href+"#page=1");
file.slice(blocksize*(page-1),blocksize+extrasize).then((buffer)=>{
let u8 = new Uint8Array(buffer);
let u8len = u8.length;
let iStart = 0;
let limit = Math.min(u8len,extrasize);
if(1!=page){
for(let i=1;i<limit;i=i+2){
if(10==u8[i] && 10==u8[i-1]) {
iStart = i+1;
break;
}
}
}
let iEnd = Math.min(u8len,blocksize);
limit = Math.min(u8len,blocksize+extrasize);
for(let i=blocksize+1;i<limit;i=i+2){
if(10==u8[i] && 10==u8[i-1]) {
iEnd = i+1;
break;
}
}
render(u8.slice(iStart,iEnd));
});
}
//#offset=&[len]&page=
{
let url = location.href;
file = new absFile(url);
}
window.addEventListener('hashchange',loadSlice);
</script>
</head>
<body>
<script>loadSlice();</script>
</body>

View file

@ -0,0 +1,92 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<base href="https://jamesfengcao.codeberg.page/en/searchurl/bingAI/">
<title id="docTitle">NewBingGoGo</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.2.0/github-markdown.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.4/katex.min.css">
<link rel="stylesheet" type="text/css" href="./css/bing.css">
</head>
<body>
<div id="background" class="b"></div>
<div id="tail">
<div id="tail-in">
<input id="restartNewChat" class="onShow" type="button" value="new chat">
<input id="restart" type="button" value="🧹">
<div id="input-div">
<textarea id="input" type="text" enterkeyhint="send" autocapitalize="off" autocomplete="off" aria-autocomplete="both" spellcheck="false" aria-label="ask Bing" autocorrect="off" placeholder="type question here..."></textarea>
<input id="send" type="button" value="✓">
</div>
</div>
<div id="SearchSuggestions">
</div>
</div>
<div id="body">
<div id="popup">
<h5 style="text-align: center; margin:0;">输入魔法链接</h5>
<input type="text" id="url-input" style="width: 97%;display: inline-block;"
onkeydown="if (event.keyCode == 13) {let v=this.value;localStorage.setItem('GoGoUrl',v);}">
<h5 style="text-align: center; margin:0;">聊天方式</h5>
<select id="tallSelect" style="width: 100%;" onchange="localStorage.setItem('ChatHubWithMagic',this.selectedIndex);">
<option>复用聊天(最快)(用魔法创建聊天后在失效前都使用这个聊天)</option>
<option>正常聊天(推荐)(用魔法创建聊天后正常聊天)</option>
<option>魔法聊天(较慢)(用魔法创建聊天后继续使用魔法聊天)</option>
</select>
</div>
<div style="text-align: center;">
<h3>chat with bing</h3>
</div>
<div id="chatTypeDiv" style="opacity: 1;">
<div class="chatTypeChose" id="chatTypeChoseCreate">
<p>More</p>
<h3>Creative</h3>
</div>
<div class="chatTypeChose Chose" id="chatTypeChoseBalance">
<p>More</p>
<h3>Balanced</h3>
</div>
<div class="chatTypeChose" id="chatTypeChoseAccurate">
<p>More</p>
<h3>Precise</h3>
</div>
</div>
<div id="chat">
<div class="bing">
<div class="adaptiveCardsFatherDIV">
<div class="textBlock markdown-body">
I am ready to chat
</div>
<div class="throttling">
0 / 0
</div>
</div>
</div>
</div>
<div id="body-bottom"></div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/4.3.0/marked.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.4/katex.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.4/contrib/auto-render.min.js"></script>
<script>
async function getMagicUrl() {
let v = localStorage.GoGoUrl;
if(v && v.startsWith("http")) return v;
return "https://mybing.xn--xyza.top/";
}
function getStartProposes(){return ["","",""];}
function getStartMessage(){return "";}
</script>
<script type="text/javascript" src="./js/GetSet.js"></script>
<script type="text/javascript" src="./js/optionsSets.js"></script>
<script type="text/javascript" src="./js/bingChatHub.js"></script>
<script type="text/javascript" src="./js/parserReturn.js"></script>
<script type="text/javascript" src="./js/bing.js"></script>
</body>
</html>

View file

@ -0,0 +1,205 @@
/* 头部分 */
body {
font-family: "Segoe UI", Arial, "Microsoft Yahei", sans-serif;
font-size: 75%;
}
#head {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 4rem;
display: flex;
align-items: center;
justify-content: space-between;
backdrop-filter: blur(10px);
background-color: #ffffff78;
z-index: 99;
}
#head-img-div {
height: 100%;
display: flex;
justify-content: flex-start;
align-items: center;
}
#head-img-div>img {
height: 100%;
}
#head-img-div-h2-img>* {
margin: 0;
}
#head-li-div {
display: flex;
flex-direction: row;
align-items: center;
}
#head-li-div>li {
list-style: none;
margin-right: 1rem;
font-size: 1rem;
}
#head-li-div>a {
display: inline-block;
list-style: none;
margin-right: 1rem;
font-size: 1rem;
color: inherit;
text-decoration: inherit;
}
#head-li-div>a:hover{
color: #ff8300;
}
/* 背景*/
#background {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
background: repeating-linear-gradient(359deg, rgb(182 196 255) 0%, rgb(207 225 255 / 78%) 100%);
}
body.a #background,
body.a .ThemeColors {
transition: filter 1s;
filter: hue-rotate(10deg);
}
body.b #background,
body.b .ThemeColors {
transition: filter 1s;
filter: hue-rotate(-15deg);
}
body.c #background,
body.c .ThemeColors {
transition: filter 1s;
filter: hue-rotate(-40deg);
}
#body{
margin-top: 4rem;
overflow: hidden;
}
#DrawDiv{
background-color: #ffffff70;
min-height: 30rem;
max-width: 45rem;
margin: 1rem auto auto;
border-radius: 1.5rem;
overflow: hidden;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
align-items: stretch;
}
#inputDraw{
resize: none;
background-color: #ffffff00;
flex: 1;
margin-left: 1rem;
height: 2rem;
font-size: 1rem;
border: none;
outline:none;
line-height: 2rem;
}
#DrawInputDiv{
background-color: #ffffff;
margin-left: 1rem;
margin-right: 1rem;
margin-top: 1rem;
border-radius: 0.5rem;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-items: stretch;
}
#startDraw{
background-color: #0e00ff36;
border-radius: 0 0.5rem 0.5rem 0;
display: flex;
padding: 0.5rem;
align-items: center;
cursor: pointer;
font-size: 1rem;
}
#startDraw:hover{
background-color: rgba(14, 0, 255, 0.56);
}
#DrawInputDiv{
border: 1px solid rgba(0, 0, 0, 0.21);
}
#DrawInputDiv:has(#inputDraw:focus-visible){
border: 1px solid #0e00ff36;
}
#imgs{
margin-top: 1rem;
background-color: #c2b4ff29;
flex: 1;
border: 0.2rem solid #ffffff70;
border-top: none;
border-radius: 0 0 1.5rem 1.5rem;
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: stretch;
justify-content: space-around;
align-content: space-around;
color: #ff8300;
font-size: 1rem;
font-weight: bolder;
}
#imgs>img{
width: 49%;
margin: 0.5%;
transition: all 0.5s;
cursor: pointer;
}
#imgs>img:hover{
transform:translate(-0.5%, -0.5%);
}
@media screen and (max-width:500px) {
:root {
font-size: 3.5vmin;
}
#imgs>img{
width: 99%;
}
}
@media screen and (orientation:portrait) and (max-device-width:800px) and (max-device-height:1000px) {
:root {
font-size: 3.5vmin;
}
#imgs>img{
width: 99%;
}
}

View file

@ -0,0 +1,582 @@
/* 头部分 */
#head {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 4rem;
display: flex;
align-items: center;
justify-content: space-between;
backdrop-filter: blur(10px);
background-color: #ffffff78;
z-index: 99;
}
#head-img-div {
height: 100%;
display: flex;
justify-content: flex-start;
align-items: center;
}
#head-img-div>img {
height: 100%;
}
#head-img-div-h2-img>* {
margin: 0;
}
#head-li-div {
margin-right: 2rem;
}
/* 背景*/
#background {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
background: repeating-linear-gradient(359deg, rgb(182 196 255) 0%, rgb(207 225 255 / 78%) 100%);
transition: filter 1s;
}
#background.a {
filter: hue-rotate(10deg);
}
#background.b {
filter: hue-rotate(-5deg);
}
#background.c {
filter: hue-rotate(-20deg);
}
/* 尾部分 */
#tail {
position: fixed;
left: 0;
bottom: 0;
width: 100%;
height: 7rem;
display: flex;
justify-content: center;
backdrop-filter: blur(10px);
background-color: #ffffff78;
flex-direction: column-reverse;
align-items: center;
z-index: 99;
}
#SearchSuggestions {
position: fixed;
top: -3rem;
display: flex;
flex-wrap: nowrap;
flex-direction: row;
justify-content: center;
align-items: center;
width: 100%;
transition: opacity 0.2s
}
#SearchSuggestions>a {
backdrop-filter: blur(10px);
background-color: #ffffff82;
border-radius: 2rem;
padding: 0.5rem;
font-size: 0.9rem;
margin: 0.2rem;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
transition: flex 0.5s;
}
#SearchSuggestions>a:hover {
cursor: pointer;
background-color: #ffffff;
flex: none;
}
#tail-in {
display: flex;
width: 80%;
align-items: center;
justify-content: center;
height: 80%;
}
#restart:hover ,
#restartNewChat:hover
{
background-color: #ffffff;
cursor: pointer;
}
#restart ,
#restartNewChat
{
border: 0;
border-radius: 1.5rem;
background-color: #ffffff9e;
height: 100%;
font-size: 0.8rem;
transition: all 0.5s;
overflow: hidden;
white-space: normal;
}
#restart {
width: 0;
margin: 0;
padding: 0;
opacity: 0;
}
body:has(.my) #restart {
width: 5rem;
margin-right: 0.5rem;
padding: 0;
opacity: 1;
}
#restartNewChat{
width: 5rem;
margin-right: 0.5rem;
}
#restartNewChat.onShow{
width: 0;
margin: 0;
padding: 0;
opacity: 0;
}
#send {
border: 0;
margin: 0 1rem 1rem 0;
border-radius: 2rem;
background-color: #005fff38;
height: 1.8rem;
font-size: 0.8rem;
cursor: pointer;
min-width: 3rem;
transition: all 0.5s;
}
#send:hover {
background-color: #005fff80;
}
#input {
border: none;
resize: none;
outline: none;
width: 100%;
background-color: #ffffff00;
margin: 1rem 0 1rem 1rem;
height: -webkit-fill-available;
}
#input:focus-visible {
border: 0;
}
#input-div {
border-radius: 1.5rem;
flex: 1;
height: 100%;
background-color: #ffffff;
margin: 0 0;
display: flex;
flex-direction: row;
align-items: flex-end;
transition: all 0.5s;
}
/* 页面部分 */
body {
overflow-x: hidden;
}
#body-bottom {
height: 15rem;
width: 100%;
}
/* 聊天选项部分 */
#chatTypeDiv {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
flex-wrap: nowrap;
margin-bottom: 7rem;
transition: all 0.5s;
}
#chatTypeDiv>.chatTypeChose {
background-color: #ffffffcc;
border-radius: 2rem;
width: 9rem;
height: 4rem;
margin: 1rem 0.3rem;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border: 0.5rem solid #ffffffcc;
cursor: pointer;
}
#chatTypeDiv>.chatTypeChose>p {
margin: 0;
text-align: center;
}
#chatTypeDiv>.chatTypeChose>h3 {
margin: 0;
text-align: center;
}
#chatTypeChoseCreate.Chose {
background-color: #904887;
color: white;
cursor: default;
}
#chatTypeChoseBalance.Chose {
background-color: #2870EA;
color: white;
cursor: default;
}
#chatTypeChoseAccurate.Chose {
background-color: #006880;
color: white;
cursor: default;
}
/* 聊天部分,在页面内 */
@keyframes acceptMeaaage {
from {
margin-top: 1em;
margin-left: -4em;
opacity: 0;
}
to {}
}
@keyframes sendMeaaage {
from {
margin-top: 1em;
margin-right: -4em;
opacity: 0;
}
to {}
}
.bing,
.my {
margin-bottom: 2rem;
}
.bing {
display: grid;
justify-items: start;
}
.bing>* {
animation: acceptMeaaage 0.5s;
}
.my>* {
animation: sendMeaaage 0.5s;
}
.my {
text-align: right;
font-size: 1.3rem;
}
.InternalSearchQuery,
.InternalLoaderMessage {
margin-left: 1rem;
font-size: 1rem;
}
.InternalSearchQuery>p,
.InternalLoaderMessage>p {
margin: 0;
margin-bottom: 1rem;
}
.adaptiveCardsFatherDIV,
.my>.bobo {
display: inline-block;
background-color: #ffffff;
border-radius: 1rem;
padding: 1rem 1rem;
max-width: 85vw;
margin-bottom: 1rem;
text-align: left;
}
.adaptiveCardsFatherDIV .throttling {
text-align: end;
font-size: 0.4rem;
margin-top: 0.5rem;
margin-bottom: -0.8rem;
border-top: 1px solid #0000005c;
}
.bing>.sourceAttributions {
font-size: 0.9rem;
max-width: 85vw;
margin: 0;
margin-bottom: 1rem;
display: inline-flex;
flex-direction: row;
flex-wrap: nowrap;
align-items: center;
background-color: #ffffff57;
border-radius: 2rem;
padding: 0.5rem;
}
.bing:has(.sourceAttributions) .adaptiveCardsFatherDIV {
margin-bottom: 1em;
}
.bing>.sourceAttributions>a {
display: inline-block;
background-color: #ffffff73;
border-radius: 1rem;
padding: 0.5rem;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
margin: 0.1rem;
color: #000000;
text-decoration: none;
transition: flex 0.5s;
}
.bing>.sourceAttributions>a:hover {
background-color: #ffffffb3;
flex: none;
}
/* 上标 */
#chat .superscript {
display: inline-block;
vertical-align: super;
border: 0.1rem solid #0969da;
border-radius: 1em;
min-width: 1em;
text-align: center;
line-height: 1em;
font-size: small;
color: #0969da;
}
#chat .superscript:hover {
background-color: #00000024;
}
/*暂时不知道如何解析的渲染卡片请求*/
.RenderCardRequest {
border-radius: 1em;
background-color: white;
overflow: auto;
padding: 1em;
width: 85vw;
max-width: 1100px;
}
.RenderCardRequest>iframe {
min-width: 768px;
width: 100%;
height: 602px;
border: 0;
}
/* 画图部分 */
.GenerateContentQuery {
background-color: #ffffff;
border-radius: 1rem;
max-width: 85%;
margin-bottom: 1rem;
text-align: center;
font-size: 1rem;
padding: 1rem;
overflow: hidden;
display: inline-table;
}
.GenerateContentQuery>img {
max-width: 24%;
margin: 0.5%;
transition: all 0.8s;
cursor: pointer;
}
.GenerateContentQuery>img:hover {
margin: 0.2% 0.8% 0.8% 0.2%;
box-shadow: #0000007a 2px 3px 5px 0px;
transition: all 0.3s;
}
/* 错误部分 */
#chat .error {
text-align: center;
color: red;
}
.NoPower {
text-align: center;
color: #ff6d00;
cursor: pointer;
margin: 1rem;
text-decoration: underline;
}
/* 用于适配不同设备 */
/* pc */
:root {
font-size: 1rem;
}
div.markdown-body {
font-size: 1rem;
overflow: auto;
}
/* 窄窗口 */
@media screen and (max-width:550px) {
#tail-in:has(#input:focus-visible) #restart,
#tail-in:has(#input:hover) #restart,
#tail-in:has(#input:focus-visible) #restartNewChat,
#tail-in:has(#input:hover) #restartNewChat {
width: 0;
margin: 0;
padding: 0;
opacity: 0;
}
.GenerateContentQuery>img {
max-width: 49%;
width: 49%;
}
#tail-in {
width: 90%;
}
.bing>.sourceAttributions {
flex-wrap: wrap;
}
}
/*手机 css*/
@media screen and (orientation:portrait) and (max-device-width:800px) and (max-device-height:1000px) {
.InternalSearchQuery,
.InternalLoaderMessage {
width: 90%;
}
.InternalSearchQuery>p,
.InternalLoaderMessage>p {
font-size: 1rem;
}
.bing>.sourceAttributions {
max-width: 88vw;
flex-wrap: wrap;
}
.adaptiveCardsFatherDIV,
.my>.bobo {
max-width: 88vw;
}
#tail-in {
width: 90%;
}
#restart {
font-size: 1em;
}
#input {
font-size: 1em;
}
.GenerateContentQuery>img {
max-width: 49%;
width: 49%;
}
#tail-in:has(#input:focus-visible) #restart,
#tail-in:has(#input:hover) #restart,
#tail-in:has(#input:focus-visible) #restartNewChat,
#tail-in:has(#input:hover) #restartNewChat {
width: 0;
margin: 0;
padding: 0;
opacity: 0;
}
/* 聊天部分,在页面内 */
@keyframes acceptMeaaage {
from {
margin-top: 1em;
margin-left: 0em;
opacity: 0;
}
to {}
}
@keyframes sendMeaaage {
from {
margin-top: 1em;
margin-right: 0em;
opacity: 0;
}
to {}
}
}

View file

@ -0,0 +1,54 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="UTF-8">
<base href="https://jamesfengcao.codeberg.page/en/searchurl/bingAI/">
<title id="docTitle">Draw</title>
<link rel="stylesheet" href="./css/DrawImg.css">
<script>
function getMagicUrl() {
let v = localStorage.GoGoUrl;
if(v && v.startsWith("http")) return v;
return "https://mybing2.xn--xyza.top/";
}
const magicUrl = getMagicUrl();
</script>
<script type="text/javascript" src="./js/generateImages.js"></script>
</head>
<body>
<div id="DrawDiv">
<div id="DrawInputDiv">
<textarea id="inputDraw" placeholder="Describe your image" ></textarea>
<input id="startDraw" type="button" value="Draw" onClick="draw()">
</div>
<div id="imgs">
</div>
</div>
<script>
const inputDraw = document.getElementById('inputDraw');
const imgsDiv = document.getElementById('imgs');
async function draw() {
let text = inputDraw.value;
try {
imgsDiv.innerText = `正在生成'${text}'图片,请稍等..`;
imgs = await generateImages(text,undefined,(v)=>{
imgsDiv.innerText = `正在生成'${text}'图片,请稍等..${v}`;
});
}catch (error){}
imgsDiv.innerHTML = '';
imgs.forEach((v)=>{
let img = document.createElement('img');
img.src = v.mImg;
imgsDiv.appendChild(img);
img.onclick = ()=>{
window.open(v.img);
}
//在低分辨率图片加载完成后替换成高分辨率图片
img.onload = ()=>{
img.onload = undefined;
img.src = v.img;
}
});
}
</script>
</body>
</html>

View file

@ -0,0 +1,42 @@
async function setMagicUrl(url) {
localStorage.setItem('GoGoUrl',url);
}
// ture:开启使用魔法聊天|false:关闭使用魔法聊天|'repeat':开启聊天复用
async function setChatHubWithMagic(user) {
localStorage.setItem('ChatHubWithMagic',user);
}
// ture|false|'repeat'
async function getChatHubWithMagic() {
let v = localStorage.ChatHubWithMagic;
if (v) {
switch(v){
case 0:
break;
case 1:
return false;
case 2:
return true;
}
}
return 'repeat';
}
//设置上次创建的聊天
async function setLastChatJson(json) {
localStorage.setItem('LastChatJson',json);
}
//获取上次创建的聊天
async function getLastChatJson() {
return localStorage.LastChatJson;
}
//获取上次聊天聊到的消息id次数
async function getLastChatInvocationId(){
return localStorage.LastChatInvocationId;
}
//设置上次聊天聊到的消息id次数
async function setLastInvocationId(invocationId){
return localStorage.setItem('LastChatInvocationId',invocationId);
}

View file

@ -0,0 +1,59 @@
createChat(thisChatType).then((r) => {
if(r.ok) talk = r.obj;
});
/**重写重置聊天到初始状态函数 */
function reSetStartChatMessage(type) {
chat.innerHTML = ``;
isSpeaking = false;
}
/**重写函数 */
function isSpeakingStart(chatWithMagic, sendText) {
isSpeaking = true;
}
//重写
function isSpeakingFinish() {
isSpeaking = false;
}
//重写send函数
oldSend = send;
send = (text) => {
reSetStartChatMessage();
oldSend(text);
}
//重写porserTextBlock函数
/*
解析TextBlock body.type==TextBlock
*/
function porserTextBlock(body, father) {
if (!body.size) {
let div = getByClass('textBlock', 'div', father, 'markdown-body');
div.innerHTML = marked.marked(completeCodeBlock(body.text));
renderMathInElement(div,renderMathInElementOptions);
let aaas = div.getElementsByTagName('a');
//将超链接在新页面打开
for(let i=0;i<aaas.length;i++){
aaas[i].target = '_blank';
}
//如果是注释则加上上标样式
for(let i=0;i<aaas.length;i++){
let reg = new RegExp('^\\^(\\d+)\\^$');
if(reg.test(aaas[i].innerHTML)){
aaas[i].innerHTML = aaas[i].innerHTML.replace(reg,'$1');
aaas[i].classList.add('superscript');
}
}
} else if (body.size == 'small') {
//原本bing官网的small并没有输出
}
}
//重写send按钮点击事件
send_button.onclick = () => {
let text = input_text.value;
send(text);
};

View file

@ -0,0 +1,294 @@
var chat = document.getElementById('chat');
var chatTypeDiv = document.getElementById('chatTypeDiv');
var docTitle = document.getElementById('docTitle');
var restart_button = document.getElementById('restart');
var input_text = document.getElementById('input');
var send_button = document.getElementById('send');
let restartNewChat = document.getElementById('restartNewChat');
var thisChatType = chatTypes.balance;
//全局变量
var talk;
var returnMessage;
var isSpeaking = false;
reSetStartChatMessage();
//(string)
function addMyChat(message) {
let bobo = document.createElement('div');
bobo.style.whiteSpace = 'pre-wrap';
bobo.innerText = message;
bobo.classList.add('bobo');
bobo.classList.add('markdown-body');
let go = document.createElement('div');
go.classList.add('my');
go.appendChild(bobo);
chat.appendChild(go);
}
//(string)
function addError(message) {
let go = document.createElement('div');
go.classList.add('error');
go.innerHTML = message;
chat.appendChild(go);
}
let onMessageIsOKClose = false;
//(json)
function onMessage(json, returnMessage) {
if (json.type == "close") {
isSpeakingFinish();
if (!onMessageIsOKClose) {
addError("聊天异常中断了!可能是网络问题。");
}
return;
}
if (json.type == 'error') {
addError("连接发生错误:" + json.mess);
return;
}
onMessageIsOKClose = false
if (json.type == 3) {
onMessageIsOKClose = true;
returnMessage.getCatWebSocket().close(1000, 'ok');
} else {
localStorage.removeItem('LastChatJson');
if (json.type == 1) {
porserArguments(json.arguments);
} else if (json.type == 2) {
porserType2Item(json.item);
} else {
console.log(JSON.stringify(json));
}
}
}
//页面逻辑
//回车键发送 ctrl+回车换行
input_text.addEventListener('keydown', (event) => {
if (event.key === 'Enter' && !event.altKey) {
event.preventDefault();
//调用发送消息的函数
send_button.onclick();
} else if (event.key === 'Enter' && event.altKey) {
event.preventDefault();
// 插入换行符
input_text.value += "\n";
}
});
/**重置聊天框和聊天建议到初始状态 */
function reSetStartChatMessage(type) {
createChat(thisChatType).then((r) => {
if(r.ok) talk = r.obj;
});
getChatHubWithMagic().then(async a => {
let t = 0;
if (a == 'repeat') {
t = await getLastChatInvocationId();
}
chat.innerHTML = `
<div class="bing">
<div class="adaptiveCardsFatherDIV">
<div class="textBlock markdown-body">
</div>
<div class="throttling">
${t} / 0
</div>
</div>
</div>
`;
});
}
/**正在创建聊天 */
function isAskingToMagic() {
isSpeaking = true;
send_button.value = '施法中.';
}
/**bing正在回复 */
function isSpeakingStart(chatWithMagic, sendText) {
isSpeaking = true;
if (sendText) {
docTitle.innerText = sendText;
}
send_button.value = '响应中.';
}
/**bing回复结束 */
function isSpeakingFinish() {
isSpeaking = false;
send_button.value = 'submit';
}
function send(text) {
if (isSpeaking) {
return;
}
chatTypeDiv.style.opacity = 0;
addMyChat(text);
if (!talk) {
isAskingToMagic();
createChat(thisChatType).then((r) => {
if (!r.ok) {
addError(r.message);
isSpeakingFinish();
return;
}
talk = r.obj;
isSpeakingStart();
r = talk.sendMessage(text, onMessage);
if (!r.ok) {
isSpeakingFinish();
addError(r.message);
return;
}
returnMessage = r.obj;
isSpeakingStart(r.chatWithMagic, text);
});
return;
} else {
isSpeakingStart();
let r = talk.sendMessage(text, onMessage)
if (!r.ok) {
isSpeakingFinish();
addError(r.message);
return;
}
returnMessage = r.obj;
isSpeakingStart(r.chatWithMagic, text);
}
}
send_button.onclick = () => {
if (isSpeaking) {
return;
}
let text = input_text.value;
input_text.value = '';
input_update_input_text_sstyle_show_update({ target: input_text });
if (!text) {
alert('什么都没有输入呀!');
return;
}
send(text);
};
restart_button.onclick = () => {
onMessageIsOKClose = true;
if (returnMessage) {
returnMessage.getCatWebSocket().close(1000, 'ok');
returnMessage = undefined;
}
talk = undefined;
isSpeakingFinish();
reSetStartChatMessage();
chatTypeDiv.style.opacity = 1;
};
//滚动到底部显示收聊天建议
// 定义一个函数处理滚动事件
function handleScroll() {
// 获取文档的高度和滚动距离
var docHeight = document.body.scrollHeight;
var scrollPos = window.pageYOffset;
// 如果滚动到底部,显示元素,否则隐藏元素
}
// 添加滚动事件监听器
window.addEventListener("scroll", handleScroll);
//选择聊天类型,创造力,平衡,精准
let backgroundDIV = document.getElementById('background');
let chatTypeChoseCreate = document.getElementById('chatTypeChoseCreate');
let chatTypeChoseBalance = document.getElementById('chatTypeChoseBalance');
let chatTypeChoseAccurate = document.getElementById('chatTypeChoseAccurate');
//默认平衡
thisChatType = chatTypes.balance;
chatTypeChoseCreate.onclick = () => {
if (chatTypeDiv.style.opacity == 0) {
return;
}
chatTypeChoseCreate.classList.add('Chose');
chatTypeChoseBalance.classList.remove('Chose');
chatTypeChoseAccurate.classList.remove('Chose');
thisChatType = chatTypes.create;
backgroundDIV.className = 'a';
reSetStartChatMessage('create');
}
chatTypeChoseBalance.onclick = () => {
if (chatTypeDiv.style.opacity == 0) {
return;
}
chatTypeChoseCreate.classList.remove('Chose');
chatTypeChoseBalance.classList.add('Chose');
chatTypeChoseAccurate.classList.remove('Chose');
thisChatType = chatTypes.balance;
backgroundDIV.className = 'b';
reSetStartChatMessage('balance');
}
chatTypeChoseAccurate.onclick = () => {
if (chatTypeDiv.style.opacity == 0) {
return;
}
chatTypeChoseCreate.classList.remove('Chose');
chatTypeChoseBalance.classList.remove('Chose');
chatTypeChoseAccurate.classList.add('Chose');
thisChatType = chatTypes.accurate;
backgroundDIV.className = 'c';
reSetStartChatMessage('accurate');
}
// "resourceTypes": [
// "main_frame",
// "sub_frame",
// "stylesheet",
// "script",
// "image",
// "font",
// "object",
// "xmlhttprequest",
// "ping",
// "csp_report",
// "media",
// "websocket",
// "webtransport",
// "webbundle",
// "other"
// ]
//发送按钮出现逻辑
function input_update_input_text_sstyle_show_update(v) {
if (v.target.value) {
send_button.style.opacity = 1;
} else {
send_button.style.opacity = 0;
}
}
input_text.addEventListener("input", input_update_input_text_sstyle_show_update);
input_update_input_text_sstyle_show_update({ target: input_text });
//开始新聊天按钮逻辑,仅在聊天复用
restartNewChat.onclick = async () => {
localStorage.removeItem('LastChatJson');
await setLastInvocationId(1);
restart_button.onclick();
}

View file

@ -0,0 +1,266 @@
var expUrl = new RegExp('^(https?://)([-a-zA-z0-9]+\\.)+([-a-zA-z0-9]+)+\\S*$');
function getUuidNojian() {
return URL.createObjectURL(new Blob()).split('/')[3].replace(/-/g, '');
}
class SendMessageManager {
//(会话id客户端id签名id是否是开始)
//(string,string,string,boolena)
constructor(conversationId, clientId, conversationSignature,invocationId) {
this.invocationId = invocationId==undefined?1:invocationId;
this.conversationId = conversationId;
this.clientId = clientId;
this.conversationSignature = conversationSignature;
this.optionsSets = chatTypes.balance;
}
//chatTypes中的一种
setChatType(chatType) {
this.optionsSets = chatType;
}
//发送json数据
sendJson(chatWebSocket, json) {
let go = JSON.stringify(json) + '\u001e';
chatWebSocket.send(go);
console.log('发送', go)
}
//获取用于发送的握手数据
//(WebSocket)
sendShakeHandsJson(chatWebSocket) {
this.sendJson(chatWebSocket, {
"protocol": "json",
"version": 1
});
}
//获取用于发送的聊天数据
//(WebSocket,sreing)
async sendChatMessage(chatWebSocket, chat) {
let optionsSets = chatTypes[this.optionsSets];
let json = {
"arguments": [{
"source": source,
"optionsSets": optionsSets,
"allowedMessageTypes": allowedMessageTypes,
"sliceIds": sliceIds,
"verbosity": "verbose",
"traceId": getUuidNojian(),
"isStartOfSession": (this.invocationId <= 1) ? true : false,
"message": await generateMessages(this,chat),
"conversationSignature": this.conversationSignature,
"participant": {
"id": this.clientId
},
"conversationId": this.conversationId,
"previousMessages": (this.invocationId <= 1) ? await getPreviousMessages() : undefined
}],
"invocationId": this.invocationId.toString(),
"target": "chat",
"type": 4
};
this.sendJson(chatWebSocket, json);
this.invocationId++;
}
}
//处理返回消息的类
class ReturnMessage {
//(WebSocket,function:可以不传)
constructor(catWebSocket, lisin) {
this.catWebSocket = catWebSocket;
this.onMessage = [(v) => {
//console.log(JSON.stringify(v))
}];
if ((typeof lisin) == 'function') {
this.regOnMessage(lisin);
}
catWebSocket.onmessage = (mess) => {
//console.log('收到', mess.data);
let sss = mess.data.split('\u001e');
for (let i = 0; i < sss.length; i++) {
if (sss[i] == '') {
continue;
}
for (let j in this.onMessage) {
if ((typeof this.onMessage[j]) == 'function') {
try {
this.onMessage[j](JSON.parse(sss[i]), this);
} catch (e) {
console.warn(e)
}
}
}
}
}
catWebSocket.onclose = (mess) => {
for (let i in this.onMessage) {
if ((typeof this.onMessage[i]) == 'function') {
try {
this.onMessage[i]({
type: 'close',
mess: '连接关闭'
}, this);
} catch (e) {
console.warn(e)
}
}
}
}
catWebSocket.onerror = (mess) => {
console.log(mess);
for (let i in this.onMessage) {
if ((typeof this.onMessage[i]) == 'function') {
try {
this.onMessage[i]({
type: 'error',
mess: mess
}, this);
} catch (e) {
console.warn(e)
}
}
}
}
}
/*
获取消息WebSocket
*/
getCatWebSocket() {
return this.catWebSocket;
}
/**
* 注册收到消息监听器
*/
//(function(json,ReturnMessage))
regOnMessage(theFun) {
this.onMessage[this.onMessage.length] = theFun;
}
}
//处理聊天的类
class Chat {
//theChatType chatTypes变量中的其中一个
//invocationId 可以不传
//(string,ture|false|'repeat',string,string,string,theChatType,int|undefined)
constructor(magicUrl, chatWithMagic, charID, clientId, conversationSignature, theChatType,invocationId) {
this.magicUrl = magicUrl;
this.chatWithMagic = chatWithMagic;
this.sendMessageManager = new SendMessageManager(charID, clientId, conversationSignature,invocationId);
if (theChatType) {
this.sendMessageManager.setChatType(theChatType);
}
}
/**
* 返回
{
ok:true|false
message:显示消息
obj:ReturnMessage对象
}
当ok等于false时不返回ReturnMessage
* 参数 消息string,当收到消息的函数,当关闭时函数
*/
//(string,function:可以不传)
sendMessage(message, onMessage) {
try {
//let restsrstUrl = 'wss://sydney.bing.com/sydney/ChatHub';
//if (this.chatWithMagic==true)
let restsrstUrl = this.magicUrl.replace('http', 'ws')+"sydney/ChatHub";
let chatWebSocket = new WebSocket(restsrstUrl);
chatWebSocket.onopen = () => {
this.sendMessageManager.sendShakeHandsJson(chatWebSocket);
this.sendMessageManager.sendChatMessage(chatWebSocket, message);
}
return {
ok: true,
message: 'ok',
obj: new ReturnMessage(chatWebSocket, onMessage),
chatWithMagic: this.chatWithMagic==true?true:false
};
} catch (e) {
console.warn(e)
return {
ok: false,
message: "发生错误,可能是网络连接错误:" + e.message
};
}
}
}
function URLTrue(url, thiePath) {
return url + thiePath;
}
//获取newbing权限
async function getPower() {}
async function copyCookies(magicUrl) {}
//创建一个新对话
/**
返回结构如果ok等于false则无chat对象
{
ok:true|false,
message:显示消息,
obj:Cat对象
}
*/
async function createChat(theChatType) {
let chatWithMagic = await getChatHubWithMagic();
let magicUrl = await getMagicUrl();
let restartNewChat = document.getElementById('restartNewChat');
if(chatWithMagic=='repeat'){//如果是聊天复用
restartNewChat.classList.remove('onShow');
let resjson = await getLastChatJson();
if(resjson){//如果没有上次聊天或上次聊天已经失效就不返回,继续走创建聊天流程
let invocationId = await getLastChatInvocationId();
if(!invocationId){
invocationId = 1;
}
return {
ok: true,
message: 'ok',
obj: new Chat(magicUrl, chatWithMagic, resjson.conversationId, resjson.clientId, resjson.conversationSignature, theChatType,invocationId)
};
}
}
let mes;
do {
try {
let url = URLTrue(magicUrl,'turing/conversation/create');
let res = await fetch(url);
if(!res.ok){
if(res.headers.has('cf-mitigated')){
let challengeUrl = `${magicUrl}/challenge?`+location.href;
location.href=challengeUrl;
return;
}
mes = `Error code: ${res.status} ${res.statusText}`;
break;
}
let resjson = await res.json();
if (!resjson.result || resjson.result.value != 'Success') {
mes = resjson;
break;
}
//保存成功的聊天
setLastChatJson(resjson);
return {
ok: true,
message: 'ok',
obj: new Chat(magicUrl, chatWithMagic, resjson.conversationId, resjson.clientId, resjson.conversationSignature, theChatType)
};
} catch (e) {mes = e.message;}
}while(false);
return {
ok: false,
message: mes
};
}

View file

@ -0,0 +1,75 @@
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))
/**
* @param text 生成图像的描述
* @param requestId 请求id如果不是对话生成图片可以为undefined
* @param countF 回调函数获取当前是第几次请求
* @return [...{img:url,mImg:url}...] img:图片url mIng:缩略图url
* */
async function generateImages(text,requestId,countF){
let theUrls = new URLSearchParams();
theUrls.append('re', '1');
theUrls.append('showselective', '1');
theUrls.append('sude', '1');
theUrls.append('kseed', '7500');
theUrls.append('SFX', '2');
theUrls.append('q', text);
theUrls.append('iframeid', requestId);
let theUrl = magicUrl+`images/create?${theUrls.toString()}`;
let response = await fetch(theUrl,
{"sec-fetch-site": "same-origin",
"referer": "https://www.bing.com/search?q=bingAI"});
let html = (await response.text());
//let cookieID = response.headers.get('cookieID');
//如果返回的是有错误的页面
let urr = new RegExp('class="gil_err_mt">([^<>]*)</div>').exec(html);
if(urr && urr[1]){
let error = `<h3>${urr[1]}</h3>`;
urr = new RegExp('class="gil_err_sbt">(([^<>]*<(a|div)[^<>]*>[^<>]*</(a|div)>[^<>]*)*)</div>').exec(html);
if(urr && urr[1]){
error = error+`<p>${urr[1]}</p>`;
}
throw new Error(error);
}
//如果没错误就匹配链接获取图片
urr = new RegExp('"/(images/create/async/results/(\\S*))"').exec(html);
if(!urr || !urr[1]){
console.log(html);
throw new Error("请求图片返回不正确的页面,无法加载图片。");
}
let ur = urr[1];
ur = ur.replaceAll('&amp;','&');
let imgPageHtmlUrl = magicUrl + `${ur}`;
let options = {"sec-fetch-site":"same-origin", "referer":"https://www.bing.com/images/create?partner=sydney&showselective=1&sude=1&kseed=7000"};
for(let count = 1;count<=20;count++){
if((!!countF)&&(typeof countF =='function')){
countF(count);
}
await sleep(3000);
let imgPageHtml;
try{
imgPageHtml = (await (await fetch(imgPageHtmlUrl,options)).text());
}catch(e){
console.error(e);
}
if(!imgPageHtml){
continue;
}
//用正则找全部图片
let allSrc = imgPageHtml.matchAll(/<img[^<>]*src="([^"]*)"[^<>]*>/g);
let imgs = [];
for(let src;!(src=allSrc.next()).done;){
imgs[imgs.length] = {
img:src.value[1].split('?')[0],
mImg:src.value[1].replaceAll('&amp;','&')
}
}
if(imgs.length>0){
return imgs;
}else{
throw new Error("服务器未正常返回图片!");
}
}
}

View file

@ -0,0 +1,183 @@
//聊天选项
let chatTypes = {
//更有创造力选项
create: [
"nlu_direct_response_filter",
"deepleo",
"disable_emoji_spoken_text",
"responsible_ai_policy_235",
"enablemm",
"h3imaginative",
"objopinion",
"eredirecturl",
"dv3sugg",
"autosave",
"clgalileo",
"gencontentv3",
"prompttrcp"
],
//balance 平衡模式选项
balance: [
"nlu_direct_response_filter",
"deepleo",
"disable_emoji_spoken_text",
"responsible_ai_policy_235",
"enablemm",
"galileo",
"objopinion",
"eredirecturl",
"dv3sugg",
"autosave",
"saharagenconv5"
],
//精准选项
accurate: [
"nlu_direct_response_filter",
"deepleo",
"disable_emoji_spoken_text",
"responsible_ai_policy_235",
"enablemm",
"h3precise",
"objopinion",
"eredirecturl",
"dv3sugg",
"autosave",
"clgalileo",
"gencontentv3",
"prompttrcp"
]
}
//消息来源
let source = "cib";
//接收消息类型
let allowedMessageTypes = [
"ActionRequest",
"Chat",
"Context",
"InternalSearchQuery",
"InternalSearchResult",
"Disengaged",
"InternalLoaderMessage",
"Progress",
"RenderCardRequest",
"AdsQuery",
"SemanticSerp",
"GenerateContentQuery",
"SearchQuery"
]
//切片id也不知道是啥意思反正官网的更新了
let sliceIds = [
"winmuid1tf",
"osbsdusgreccf",
"contansperf",
"mlchatpc2",
"winstmsg2tf",
"creatgoglt2",
"creatorv2t",
"norespwcf",
"0521dur5",
"dur5",
"517opinion",
"418dhlths0",
"525ptrcp",
"kcimgv2cf",
"kcimgatt",
"427startpms0"
]
//生成消息对象
async function generateMessages(sendMessageManager/*消息管理器*/,chatMessageText/*要发送的消息文本*/){
function timeString() {
var d = new Date();
var year = d.getFullYear();
var month = (d.getMonth() + 1).toString().padStart(2, "0");
var date = d.getDate().toString().padStart(2, "0");
var hour = d.getHours().toString().padStart(2, "0");
var minute = d.getMinutes().toString().padStart(2, "0");
var second = d.getSeconds().toString().padStart(2, "0");
var offset = "+08:00"; // 你可以根据需要修改这个值
var s = year + "-" + month + "-" + date + "T" + hour + ":" + minute + ":" + second + offset;
return s;
}
if(!sendMessageManager.startTime){
sendMessageManager.startTime = timeString();
}
return {
"locale": "zh-CN",
"market": "zh-CN",
"region": "US",
"location": "lat:47.639557;long:-122.128159;re=1000m;",
"locationHints": [
{
"Center": {
"Latitude": 30.474109798833613,
"Longitude": 114.39626256171093
},
"RegionType": 2,
"SourceType": 11
},
{
"country": "United States",
"state": "California",
"city": "Los Angeles",
"zipcode": "90060",
"timezoneoffset": -8,
"dma": 803,
"countryConfidence": 8,
"cityConfidence": 5,
"Center": {
"Latitude": 33.9757,
"Longitude": -118.2564
},
"RegionType": 2,
"SourceType": 1
}
],
"timestamp": sendMessageManager.startTime,
"author": "user",
"inputMethod": "Keyboard",
"text": chatMessageText,
"messageType": "Chat"
}
}
async function getPreviousMessages(){
function getUuid() {
return URL.createObjectURL(new Blob()).split('/')[3];
}
let pos = getStartProposes();
return [{
"text": getStartMessage(),
"author": "bot",
"adaptiveCards": [],
"suggestedResponses": [{
"text": pos[0],
"contentOrigin": "DeepLeo",
"messageType": "Suggestion",
"messageId": getUuid(),
"offense": "Unknown"
}, {
"text": pos[1],
"contentOrigin": "DeepLeo",
"messageType": "Suggestion",
"messageId": getUuid(),
"offense": "Unknown"
}, {
"text": pos[2],
"contentOrigin": "DeepLeo",
"messageType": "Suggestion",
"messageId": getUuid(),
"offense": "Unknown"
}],
"messageId": getUuid(),
"messageType": "Chat"
}];
}

View file

@ -0,0 +1,418 @@
/**
(id,元素的tag,父元素,创建时顺便添加的class:可以多个)
获取一个指定id的元素如果没用就在服元素创建这个元素
*/
function getByID(id, tag, father) {
let t = document.getElementById(id);
if (!t) {
t = document.createElement(tag);
t.id = id;
for (let i = 3; i < arguments.length; i++) {
if (arguments[i]) {
t.classList.add(arguments[i]);
}
}
father.appendChild(t);
}
return t;
}
function getByClass(className, tag, father) {
let t = father.getElementsByClassName(className)[0];
if (!t) {
t = document.createElement(tag);
t.classList.add(className);
for (let i = 3; i < arguments.length; i++) {
if (arguments[i]) {
t.classList.add(arguments[i]);
}
}
father.appendChild(t);
}
return t;
}
function test(test) {
porserArguments(test.arguments);
}
var throttling = {
"maxNumUserMessagesInConversation": 0,
"numUserMessagesInConversation": 0
};
//解析type2的item
function porserType2Item(item){
let chatDiv = document.getElementById('chat');
if(item.result){
let result = item.result;
if(result.value=='Success'){
}else if (result.value == 'Throttled') {
addError(result.message);
addError('24消息请求数达到了限制');
}else{
addError(result.message);
addError('发生未知错误!');
}
}
if (item.throttling) {
throttling = item.throttling;
}
if (item.messages) {
let nextFather = getByID(item.requestId, 'div', chatDiv, 'bing');
porserMessages(item.messages, nextFather);
}
}
/**
* 解析arguments
* 解析聊天消息将消息添加到页面
* **/
function porserArguments(argumentss) {
for (let i = 0; i < argumentss.length; i++) {
porserType2Item(argumentss[i]);
}
}
/*
解析messages
*/
function porserMessages(messages, father) {
for (let i = 0; i < messages.length; i++) {
let message = messages[i];
if(message.author=='user'){
continue;//不解析用户的消息
}
//解析adaptiveCards 也就是聊天消息部分 下面类型的都是带有adaptiveCards的
if (!message.messageType && message.adaptiveCards) {//如果是正常的聊天
let adaptiveCardsFatherDIV = getByID(message.messageId, 'div', father, 'adaptiveCardsFatherDIV');
porserAdaptiveCards(message.adaptiveCards, adaptiveCardsFatherDIV);
//解析sourceAttributions 也就是引用链接部分
if (message.sourceAttributions) {
if (message.sourceAttributions.length > 0) {
let sourceAttributionsDIV = getByID(message.messageId + 'sourceAttributions', 'div', father, 'sourceAttributions');
porserSourceAttributions(message.sourceAttributions, sourceAttributionsDIV);
}
}
//解析suggestedResponses 建议发送的消息,聊天建议
if (message.suggestedResponses) {
porserSuggestedResponses(message.suggestedResponses);
}
} else if (message.messageType == 'InternalSearchQuery') { //如果是收索消息
let div = getByID(message.messageId, 'div', father, 'InternalSearchQuery');
porserLineTextBlocks(message.text, div);
} else if (message.messageType == 'InternalLoaderMessage') { //如果是加载消息
let div = getByID(message.messageId, 'div', father, 'InternalLoaderMessage');
porserLineTextBlocks(message.text, div);
} else if (message.messageType == 'GenerateContentQuery') {//如果是生成内容查询
let div = getByID(message.messageId, 'div', father, 'GenerateContentQuery');
generateContentQuery(message, div);
}else if (message.messageType == 'RenderCardRequest'){//渲染卡片请求,目前不知道有什么用
renderCardRequest(message, father);
}else if(message.messageType == 'Disengaged'){
let div = getByID(message.messageId, 'div', chat, 'error');
div.innerHTML = `
${message.hiddenText}<br>聊天中断试试开始新主题
`;
}else if(message.contentOrigin == 'TurnLimiter'){
addError(message.text);
addError('聊天被限制了,试试开始新主题?');
} else {
console.log('发现一个另类message', JSON.stringify(message));
}
}
}
/*
解析渲染卡片请求暂时不知道如何解析这个请求,就先判断里面有没有内容吧没有就不显示
*/
function renderCardRequest(message,father){
if(father[message.messageId+'renderCardRequest']){//防止解析多次
return;
}
father[message.messageId+'renderCardRequest'] = true;
let url = 'https://www.bing.com/search?'
let theUrls = new URLSearchParams();
theUrls.append("showselans",1);
theUrls.append("q",message.text);
theUrls.append("iframeid",message.messageId);
let src = url+theUrls.toString();
fetch(src).then(async (ret)=>{
let html = await ret.text();
// b_poleContent pc设备 || b_ans b_imgans 移动设备
if(html.indexOf('class="b_poleContent"')>=0 || html.indexOf('class="b_ans')>=0){
let div = getByID(message.messageId, 'div', father, 'RenderCardRequest');
div.innerHTML = `<iframe role="presentation" src="${src}"></iframe>`;
}
});
}
/*
解析generateContentQuery生成内容查询,目前是只有图片
*/
function generateContentQuery(message, father) {
if(message.contentType=="IMAGE"){
if(father.runed){//防止生成多次
return;
}
father.runed = true;
generateContentQueryImg(message, father);
}else{
console.log('发现一个另类generateContentQuery', JSON.stringify(message));
}
}
/**
* 解析图片生成目前是只有图片
*/
function generateContentQueryImg(message, father){
getMagicUrl().then(async magicUrl => {
if (!magicUrl) {
addError("魔法链接不正确!无法加载图片");
return;
}
if (!expUrl.test(magicUrl)) {
addError("魔法链接不正确!无法加载图片")
return;
}
let theUrls = new URLSearchParams();
theUrls.append('re', '1');
theUrls.append('showselective', '1');
theUrls.append('sude', '1');
theUrls.append('kseed', '7500');
theUrls.append('SFX', '2');
theUrls.append('q', message.text);
theUrls.append('iframeid', message.requestId);
let theUrl = URLTrue(magicUrl,"images/create?") + theUrls.toString();
try{
father.innerHTML = `正在生成${message.text}的图片.`;
let html = (await (await fetch(theUrl)).text());
//如果有错误就输出错误
let urr = new RegExp('class="gil_err_mt">([^<>]*)</div>').exec(html);
if(urr && urr[1]){
father.innerHTML = `<h3>${urr[1]}</h3>`
urr = new RegExp('class="gil_err_sbt">(([^<>]*<(a|div)[^<>]*>[^<>]*</(a|div)>[^<>]*)*)</div>').exec(html);
if(urr && urr[1]){
father.innerHTML = father.innerHTML+`<p>${urr[1]}</p>`;
}
return;
}
//如果没错误就匹配链接获取图片
urr = new RegExp('"/(images/create/async/results/(\\S*))"').exec(html);
if(!urr || !urr[1]){
console.log(html);
addError("请求图片返回不正确的页面,无法加载图片。");
return;
}
let ur = urr[1];
ur = ur.replaceAll('&amp;','&');
let imgPageHtmlUrl = URLTrue(magicUrl,ur);
let count = 0;
let run = async ()=>{
father.innerHTML = `正在生成${message.text}的图片.${count}`;
if(count>20){
father.innerHTML = "请求图片超时!";
return;
}
count++;
let imgPageHtml;
try{
imgPageHtml = (await (await fetch(imgPageHtmlUrl)).text());
}catch(e){
console.error(e);
}
if(!imgPageHtml){
setTimeout(run,3000);
return;
}
father.innerHTML = '';
let theUrls = new URLSearchParams();
theUrls.append('createmessage',message.text);
let a = document.createElement("a");
father.appendChild(a);
//用正则找全部图片
let allSrc = imgPageHtml.matchAll(/<img[^<>]*src="([^"]*)"[^<>]*>/g);
let src = undefined;
let ok = false;
while(!(src=allSrc.next()).done){
ok =true;
theUrls.append('imgs',src.value[1].split('?')[0]);
let img = document.createElement("img");
img.src = src.value[1];
a.appendChild(img);
}
if(ok){
a.target = '_blank';
a.href = '../GeneratePicture/img.html?'+theUrls.toString();
}else{
father.innerHTML = "服务器未正常返回图片!";
}
}
setTimeout(run,3000);
}catch(e){
console.error(e);
addError("请求图片失败:"+e);
}
});
}
/*
解析adaptiveCards 聊天消息部分
*/
function porserAdaptiveCards(adaptiveCards, father) {
for (let i = 0; i < adaptiveCards.length; i++) {
let adaptiveCard = adaptiveCards[i];
if (adaptiveCard.type == 'AdaptiveCard') {
porserbody(adaptiveCard.body, father);
} else {
console.log('发现一个不是AdaptiveCard的adaptiveCard', JSON.stringify(adaptiveCard));
}
}
}
/**
解析body adaptiveCards[].body这个部分
*/
function porserbody(bodys, father) {
for (let i = 0; i < bodys.length; i++) {
let body = bodys[i];
if (body.type == 'TextBlock') {
porserTextBlock(body, father);
}else {
console.log('发现一个不是TextBlock的body', JSON.stringify(body));
}
}
}
/**
补全代码块如果文本中有~~~开头却没有~~~结束则在最后补一个~~~防止内容生成时闪烁
*/
function completeCodeBlock(makerdown){
let to = function(regA,regB,add,makerdown){
let falst = true;
let arrs = makerdown.split('\n');
for(let i=0;i<=arrs.length;i++){
if(falst){
if(regA.test(arrs[i])){
falst = false;
}
}else{
if(regB.test(arrs[i])){
falst = true;
}
}
}
if(!falst){
makerdown = makerdown+add;
}
return makerdown;
}
let out = to(
new RegExp('^~~~.*$'),
new RegExp('^~~~( *)$'),
'\n~~~',
to(
new RegExp('^```.*$'),
new RegExp('^```( *)$'),
'\n```',
makerdown
)
);
// console.log(out);
return out;
}
renderMathInElementOptions ={
delimiters: [
{left: "$$", right: "$$", display: true},
{left: '$', right: '$', display: false},
{left: "\\(", right: "\\)", display: false},
{left: "\\begin{equation}", right: "\\end{equation}", display: true},
{left: "\\begin{align}", right: "\\end{align}", display: true},
{left: "\\begin{alignat}", right: "\\end{alignat}", display: true},
{left: "\\begin{gather}", right: "\\end{gather}", display: true},
{left: "\\begin{CD}", right: "\\end{CD}", display: true},
{left: "\\[", right: "\\]", display: true}
],
throwOnError: false
}
/*
解析TextBlock body.type==TextBlock
*/
function porserTextBlock(body, father) {
if (!body.size) {
let div = getByClass('textBlock', 'div', father, 'markdown-body');
div.innerHTML = marked.marked(completeCodeBlock(body.text));
renderMathInElement(div,renderMathInElementOptions);
let aaas = div.getElementsByTagName('a');
//将超链接在新页面打开
for(let i=0;i<aaas.length;i++){
aaas[i].target = '_blank';
}
//如果是注释则加上上标样式
for(let i=0;i<aaas.length;i++){
let reg = new RegExp('^\\^(\\d+)\\^$');
if(reg.test(aaas[i].innerHTML)){
aaas[i].innerHTML = aaas[i].innerHTML.replace(reg,'$1');
aaas[i].classList.add('superscript');
}
}
let nxdiv = getByClass('throttling', 'div', father);
nxdiv.innerHTML = `${throttling.numUserMessagesInConversation} / ${throttling.maxNumUserMessagesInConversation}`;
} else if (body.size == 'small') {
//原本bing官网的small并没有输出
}
}
/*
添加单行简单文本
*/
function porserLineTextBlocks(inline, father) {
father.innerHTML = `<p>${inline}</p>`;
}
/***
解析sourceAttributions 聊天消息引用链接部分
*/
function porserSourceAttributions(sourceAttributions, father) {
let html = '';
for (let i = 0; i < sourceAttributions.length; i++) {
let sourceAttribution = sourceAttributions[i];
html = html + `<a target="_blank" href="${sourceAttribution.seeMoreUrl}">${sourceAttribution.providerDisplayName}</a>`;
}
father.innerHTML = html;
}
/***
解析suggestedResponses 建议发送的消息聊天建议
*/
function porserSuggestedResponses(suggestedResponses) {
var searchSuggestions = document.getElementById('SearchSuggestions');
searchSuggestions.innerHTML = '';
for (let i = 0; i < suggestedResponses.length; i++) {
let a = document.createElement('a');
a.innerHTML = suggestedResponses[i].text;
a.onclick = (event)=>{send(event.target.innerHTML);}
searchSuggestions.appendChild(a);
}
}

View file

@ -0,0 +1,62 @@
//聊天选项
let chatTypes = {
//balance 平衡模式选项
balance: [
"nlu_direct_response_filter",
"deepleo",
"enable_debug_commands",
"disable_emoji_spoken_text",
"responsible_ai_policy_235",
"enablemm",
"soedgeca",
"max_turns_5",
]
}
//消息来源
let source = "edge_coauthor_prod";
//接收消息类型
let allowedMessageTypes = [
"ActionRequest",
"Chat",
"Context",
"InternalSearchQuery",
"InternalSearchResult",
"Disengaged",
"InternalLoaderMessage",
"RenderCardRequest",
"AdsQuery",
"SemanticSerp",
"GenerateContentQuery",
"SearchQuery"
]
//切片id也不知道是啥意思反正官网的更新了
let sliceIds = []
let tone = 'professional';
let length = 'short';
let format = 'paragraph';
//生成消息对象
async function generateMessages(sendMessageManager/*消息管理器*/,chatMessageText/*要发送的消息文本*/){
return {
"locale": "zh-CN",
"market": "zh-CN",
"region": "US",
"location": "lat:47.639557;long:-122.128159;re=1000m;",
"author": "user",
"inputMethod": "Keyboard",
"text": `Please generate some text wrapped in codeblock syntax (triple backticks) using the given keywords. Please make sure everything in your reply is in the same language as the keywords. Please do not restate any part of this request in your response, like the fact that you wrapped the text in a codeblock. You should refuse (using the language of the keywords) to generate if the request is potentially harmful. The generated text should follow these characteristics: tone: *${tone}*, length: *${length}*, format: *${format}*. The keywords are: \`${chatMessageText}\`.`,
"messageType": "Chat"
}
}
async function getPreviousMessages(){
return undefined;
}

View file

@ -0,0 +1,14 @@
<script>
let url = "https://muweb.us.to/turing/conversation/create";
/*
fetch(url, {credentials: 'include'})
.then(r=>r.text()).then(data=>{alert(data);});
*/
const xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.withCredentials = true;
xhr.onload = function(){
alert(xhr.responseText);
};
xhr.send();
</script>

View file

@ -0,0 +1,86 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<base href="https://jamesfengcao.codeberg.page/en/searchurl/bingAI/">
<title id="docTitle">Write</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.4/katex.min.css">
<style>
#input {
height: auto;
width: 100%;
display: block;
}
pre {white-space: pre-wrap;}
</style>
<script>
function getSelectedText(select){
return select.options[select.selectedIndex].text;
}
</script>
</head>
<body>
<select id="toneSelect" onchange="window.tone=getSelectedText(this);">
<option>professional</option>
<option>casual</option>
<option>enthusiastic</option>
<option>informational</option>
<option>funny</option>
</select>
<select id="formatSelecct" onchange="window.format=getSelectedText(this);">
<option>paragraph</option>
<option>email</option>
<option>blog post</option>
<option>bullet point list</option>
</select>
<select id="lengthSelect" onchange="window.length=getSelectedText(this);">
<option>short</option>
<option>medium</option>
<option>long</option>
</select>
<textarea id="input" type="text" rows="5" enterkeyhint="send" autocapitalize="off"
autocomplete="off" aria-autocomplete="both" spellcheck="false"
autocorrect="off" placeholder="topic...">
</textarea>
<input id="send" class="ThemeColors" type="button" value="Generate"><input id="restart" type="button" value="🧹"><input id="restartNewChat" type="button" value="new">
<div id="chat">
<div class="bing">
<div class="adaptiveCardsFatherDIV">
<div class="textBlock markdown-body">
</div>
</div>
</div>
</div>
<!-- dummy nodes -->
<div id='chatTypeDiv'>
<div id='chatTypeChoseCreate'></div>
<div id='chatTypeChoseBalance'></div>
<div id='chatTypeChoseAccurate'></div>
</div>
<script>
async function getMagicUrl() {
let v = localStorage.GoGoUrl;
if(v && v.startsWith("http")) return v;
return "https://mybing2.xn--xyza.top/";
}
function getStartProposes(){return ["","",""];}
function getStartMessage(){return "";}
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/4.3.0/marked.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.4/katex.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.4/contrib/auto-render.min.js"></script>
<script type="text/javascript" src="./js/GetSet.js"></script>
<script type="text/javascript" src="./js/w_optionsSets.js"></script>
<script type="text/javascript" src="./js/bingChatHub.js"></script>
<script type="text/javascript" src="./js/parserReturn.js"></script>
<script type="text/javascript" src="./js/bing.js"></script>
<script src="./js/Write.js"></script>
</body>
</html>

View file

@ -0,0 +1,136 @@
const SYDNEY_ORIGIN = 'https://sydney.bing.com';
const KEEP_REQ_HEADERS = [
'accept',
'accept-encoding',
'accept-language',
'connection',
'cookie',
'upgrade',
'user-agent',
'sec-websocket-extensions',
'sec-websocket-key',
'sec-websocket-version',
'x-request-id',
'content-length',
'content-type',
'access-control-request-headers',
'access-control-request-method',
];
const IP_RANGE = [
['3.2.50.0', '3.5.31.255'], //192,000
['3.12.0.0', '3.23.255.255'], //786,432
['3.30.0.0', '3.33.34.255'], //205,568
['3.40.0.0', '3.63.255.255'], //1,572,864
['3.80.0.0', '3.95.255.255'], //1,048,576
['3.100.0.0', '3.103.255.255'], //262,144
['3.116.0.0', '3.119.255.255'], //262,144
['3.128.0.0', '3.247.255.255'], //7,864,320
];
/**
* 随机整数 [min,max)
* @param {number} min
* @param {number} max
* @returns
*/
const getRandomInt = (min, max) => Math.floor(Math.random() * (max - min)) + min;
/**
* ip int
* @param {string} ip
* @returns
*/
const ipToInt = (ip) => {
const ipArr = ip.split('.');
let result = 0;
result += +ipArr[0] << 24;
result += +ipArr[1] << 16;
result += +ipArr[2] << 8;
result += +ipArr[3];
return result;
};
/**
* int ip
* @param {number} intIP
* @returns
*/
const intToIp = (intIP) => {
return `${(intIP >> 24) & 255}.${(intIP >> 16) & 255}.${(intIP >> 8) & 255}.${intIP & 255}`;
};
const getRandomIP = () => {
const randIndex = getRandomInt(0, IP_RANGE.length);
const startIp = IP_RANGE[randIndex][0];
const endIp = IP_RANGE[randIndex][1];
const startIPInt = ipToInt(startIp);
const endIPInt = ipToInt(endIp);
const randomInt = getRandomInt(startIPInt, endIPInt);
const randomIP = intToIp(randomInt);
return randomIP;
};
async function goUrl(request, url) {
let fp = {
method: request.method
};
fp.headers = new Headers(request.headers);
for(var i = 2; i < arguments.length-1; i=i+2){
fp.headers[arguments[i]] = arguments[i+1];
}
return await fetch(url, fp);
}
export default {
/**
* fetch
* @param {Request} request
* @param {*} env
* @param {*} ctx
* @returns
*/
async fetch(request, env, ctx) {
const url = request.url;
let iSlash = url.indexOf('/',11);
let nUrl = url.substring(iSlash+1);
let iColon = nUrl.indexOf(':',3)+3;
if(!nUrl.startsWith('syndey.bing.com',iColon) &&
!nUrl.startsWith('www.bing.com/turing',iColon))
return await goUrl(request, nUrl);
const targetUrl = new URL(nUrl);
const newHeaders = new Headers();
request.headers.forEach((value, key) => {
// console.log(`old : ${key} : ${value}`);
if (KEEP_REQ_HEADERS.includes(key)) {
newHeaders.set(key, value);
}
});
newHeaders.set('host', targetUrl.host);
newHeaders.set('origin', targetUrl.origin);
newHeaders.set('referer', 'https://www.bing.com/search?q=Bing+AI');
const randIP = getRandomIP();
// console.log('randIP : ', randIP);
newHeaders.set('X-Forwarded-For', randIP);
const oldUA = request.headers.get('user-agent');
const isMobile = oldUA.includes('Mobile') || oldUA.includes('Android');
if (isMobile) {
newHeaders.set(
'user-agent',
'Mozilla/5.0 (iPhone; CPU iPhone OS 15_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.7 Mobile/15E148 Safari/605.1.15 BingSapphire/1.0.410427012'
);
} else {
newHeaders.set('user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.35');
}
// newHeaders.forEach((value, key) => console.log(`${key} : ${value}`));
const newReq = new Request(targetUrl, {
method: request.method,
headers: newHeaders,
body: request.body,
});
// console.log('request url : ', newReq.url);
const res = await fetch(newReq);
return res;
},
};

View file

@ -0,0 +1,19 @@
export default {
async fetch(req, _env) {
let url = req.url;
let iSlash = url.indexOf('/',11);
let nUrl = url.substring(iSlash+1);
return await goUrl(req, nUrl);
}
}
async function goUrl(request, url) {
const Url = new URL(url);
const newReq = new Request(Url, {
method: request.method,
headers: request.headers,
body: request.body,
redirect: 'follow'
})
return await fetch(newReq);
}

View file

@ -0,0 +1,21 @@
export default {
async fetch(req, _env) {
let url = req.url;
const Url = new URL(url);
let iSlash = url.indexOf('/',11);
let nUrl = url.substring(iSlash+1);
return await goUrl(req, nUrl);
}
}
async function goUrl(request, url) {
const Url = new URL(url);
let headers = new Headers(request.headers);
headers.set("X-forwarded-for","104.28.5.161");
const newReq = new Request(Url, {
method: request.method,
headers: headers,
body: request.body
})
return await fetch(newReq);
}

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,6 @@
Serif

View file

@ -1,14 +1,9 @@
let labels = ["Default font","Cursive","Fantasy","Fixed","Sans-Serif","Serif"]; let labels = ["<a href='https://codeberg.org/uweb/pages/raw/branch/master/en/redirect/index.html#'>Global redirect url</a>","Download path (with option 'Download to sdcard')","Default font","Cursive","Fantasy","Fixed","Sans-Serif","Serif"];
let names = ["font","cursive","fantasy","fixed","sansserif","serif"]; let names = ["redirecturl","downloadpath","font","cursive","fantasy","fixed","sansserif","serif"];
let text;
let d=document; let d=document;
if(d.body)
text = d.body.innerHTML;
else
text = "\n".repeat(labels.length-1);
let sa = [`<style>input{height:40px;width:100%;border-radius:50px;}</style> let sa = [`<head><meta charset="utf-8"><meta name="viewport" content="width=device-width" /></head><style>input{height:40px;width:100%;border-radius:50px;}</style>
<datalist id="family"> <datalist id="family">
<option value="sans-serif"> <option value="sans-serif">
<option value="sans-serif-condensed"> <option value="sans-serif-condensed">
@ -18,21 +13,44 @@ let sa = [`<style>input{height:40px;width:100%;border-radius:50px;}</style>
<option value="monospace"> <option value="monospace">
<option value="cursive"> <option value="cursive">
</datalist> </datalist>
<form onsubmit="let d=document;let f=d.forms[0];d.location.href='i:0i/data/data/info.torinfo.uweb/files/config.html:'+f.font.value+ <script>
'&'+ f.cursive.value + function save(){
'&'+ f.fantasy.value + let d=document;let f=d.forms[0];
'&'+ f.fixed.value + let inputs = Array.from(f.querySelectorAll('input')).map(input => input.value);
'&'+ f.sansserif.value + inputs.pop();
'&'+ f.serif.value + inputs.push('<script charset="utf-8" src="https://jamesfengcao.codeberg.page/en/searchurl/config.js"><\\/script>');
':https://fastly.jsdelivr.net/gh/torappinfo/uwebzh/searchurl/template/config.html';return false;" accept-charset=utf-8 >`]; let str = inputs.join('\\n');
let url = 'i:b1Save config.html%0A%0Ai:8lconfig.html%0Ai:0lconfig.html:'+btoa(str);
d.location.href=url;
return false;
}
</script>
<form onsubmit="return save()" accept-charset=utf-8 >`];
function gen(text) {
let strs = text.split('\n');
let i;
for (i=0; i<2; i++)
sa.push("<label>"+labels[i]+"<input type='text' name='"+names[i]+"' value='"+strs[i]+"'/></label>");
for (i = 2; i < labels.length; i++){
sa.push("<label>"+labels[i]+"<input list='family' type='text' name='"+names[i]+"' value='"+strs[i]+"'/></label>");
}
let strs = text.split('\n'); sa.push('<input type="submit" value="Save"></form>');
let i=0; let r = sa.join('<br>');
for (i = 0; i < labels.length; i++){ d.write(r);
sa.push("<label>"+labels[i]+"<input list='family' type='text' name='"+names[i]+"' value='"+strs[i]+"'/></label>"); d.close();
} }
sa.push('<input type="submit" value="Save"></form>'); if(d.body){
let r = sa.join('<br>'); var r=new XMLHttpRequest;
d.documentElement.innerHTML = r; r.onload=function(){
var t=r.responseText;
gen(t);
}
r.open("GET",location.href,!0);
r.send(null);
}else {
let text = "\n".repeat(labels.length-1);
gen(text);
}

View file

@ -22,7 +22,7 @@ body>ul{padding-left:0;}
</ul> </ul>
<hr/> <hr/>
<p><a href="i:2516777215" onclick="return checkbox_toggle(checkBoxes.length);">Toggle</a>/<a href="i:260" onclick="return checkbox_reset(checkBoxes.length);">Reset</a>/<a href="i:2616777215" onclick="return checkbox_set(checkBoxes.length);">Check all</a>/<a href="i:2631" onclick="return checkbox_set(5);">Check 1 - 5</a>/<a href="i:26511" onclick="return checkbox_set(9);">Check 1 - 9</a> following options (click individual link to toggle):</p> <p><a href="i:252147483647" onclick="return checkbox_toggle(checkBoxes.length);">Toggle</a>/<a href="i:260" onclick="return checkbox_reset(checkBoxes.length);">Reset</a>/<a href="i:2147483647" onclick="return checkbox_set(checkBoxes.length);">Check all</a>/<a href="i:2631" onclick="return checkbox_set(5);">Check 1 - 5</a>/<a href="i:26511" onclick="return checkbox_set(9);">Check 1 - 9</a> following options (click individual link to toggle):</p>
<ul> <ul>
<li><label><input type="checkbox" onchange="location.href='i:251'"/>New tab for services (long pressing buttons etc.)</label></li> <li><label><input type="checkbox" onchange="location.href='i:251'"/>New tab for services (long pressing buttons etc.)</label></li>
<li> Switch long and short pressing actions <li> Switch long and short pressing actions
@ -32,7 +32,7 @@ body>ul{padding-left:0;}
</ul> </ul>
</li> </li>
<li><label><input type="checkbox" onchange="location.href='i:258'"/>Backgroud page loading if pressing backward button within 20 seconds</label></li> <li><label><input type="checkbox" onchange="location.href='i:258'"/>Backgroud page loading if pressing backward button within 20 seconds</label></li>
<li><label><input type="checkbox" onchange="location.href='i:2516'"/>No warning for invalid certificates</label></li> <li><label><input type="checkbox" onchange="location.href='i:2516'"/>Address bar default to https</label></li>
----------------5--------------- ----------------5---------------
<li><label><input type="checkbox" onchange="location.href='i:2532'"/>New tab for next engine search</label></li> <li><label><input type="checkbox" onchange="location.href='i:2532'"/>New tab for next engine search</label></li>
<li><label><input type="checkbox" onchange="location.href='i:2564'"/>Autocomplete to match from the string beginning</label></li> <li><label><input type="checkbox" onchange="location.href='i:2564'"/>Autocomplete to match from the string beginning</label></li>
@ -45,7 +45,7 @@ body>ul{padding-left:0;}
<li><label><input type="checkbox" onchange="location.href='i:254096'"/>Hide bottom toolbar</label></li> <li><label><input type="checkbox" onchange="location.href='i:254096'"/>Hide bottom toolbar</label></li>
<li><label><input type="checkbox" onchange="location.href='i:258192'"/>Not use 2-column bookmarks</label></li> <li><label><input type="checkbox" onchange="location.href='i:258192'"/>Not use 2-column bookmarks</label></li>
<li><label><input type="checkbox" onchange="location.href='i:2516384'"/>Home screen to use "query.autoc" for autocompletion</label></li> <li><label><input type="checkbox" onchange="location.href='i:2516384'"/>Home screen to use "query.autoc" for autocompletion</label></li>
<li><label><input type="checkbox" onchange="location.href='i:2532768'"/>Not rotates to landscape when fullscreen playing</label></li> <li><label><input type="checkbox" onchange="location.href='i:2532768'"/>Auto hide addressbar/bottom toolbar</label></li>
<li><label><input type="checkbox" onchange="location.href='i:2565536'"/>No JS alert & confirmation</label></li> <li><label><input type="checkbox" onchange="location.href='i:2565536'"/>No JS alert & confirmation</label></li>
<li><label><input type="checkbox" onchange="location.href='i:25131072'"/>Save query history</label></li> <li><label><input type="checkbox" onchange="location.href='i:25131072'"/>Save query history</label></li>
<li><label><input type="checkbox" onchange="location.href='i:25262144'"/>Keep panel when switching tabs</label></li> <li><label><input type="checkbox" onchange="location.href='i:25262144'"/>Keep panel when switching tabs</label></li>
@ -55,6 +55,11 @@ body>ul{padding-left:0;}
<li><label><input type="checkbox" onchange="location.href='i:254194304'"/>Bottom address bar</label></li> <li><label><input type="checkbox" onchange="location.href='i:254194304'"/>Bottom address bar</label></li>
<li><label><input type="checkbox" onchange="location.href='i:258388608'"/>Maximize screen size for cutouts</label></li> <li><label><input type="checkbox" onchange="location.href='i:258388608'"/>Maximize screen size for cutouts</label></li>
<li><label><input type="checkbox" onchange="location.href='i:2516777216'"/>Block dubious resources when blocking external scripts</label></li> <li><label><input type="checkbox" onchange="location.href='i:2516777216'"/>Block dubious resources when blocking external scripts</label></li>
<li><label><input type="checkbox" onchange="location.href='i:2533554432'"/>Use termux</label></li>
<li><label><input type="checkbox" onchange="location.href='i:2567108864'"/>webview debug</label></li>
<li><label><input type="checkbox" onchange="location.href='i:25134217728'"/>fullscreen playing w/o brightness & volumn gestures</label></li>
<li><label><input type="checkbox" onchange="location.href='i:25268435456'"/>Always edit downloaded file name</label></li>
<li><label><input type="checkbox" onchange="location.href='i:25536870912'"/>Long screenshot mode (bad performance, needs restart)</label></li>
</ul> </ul>
<script> <script>
checkBoxes=document.getElementsByTagName("input"); checkBoxes=document.getElementsByTagName("input");
@ -80,5 +85,6 @@ body>ul{padding-left:0;}
<a href="javascript:g('i:29')">Web font size (default:16)</a> <br/> <a href="javascript:g('i:29')">Web font size (default:16)</a> <br/>
<a href="javascript:g('i:2a')">History size (Integer, default:0 Unit:Kb, such as 90)</a> <br/> <a href="javascript:g('i:2a')">History size (Integer, default:0 Unit:Kb, such as 90)</a> <br/>
<a href="javascript:g('i:2b')">Maximal lines for addressbar (default:2, <34)</a> <br/> <a href="javascript:g('i:2b')">Maximal lines for addressbar (default:2, <34)</a> <br/>
<a href="javascript:g('i:2c')">Auto hide toolbar (default: 0, no hide. Max value: 7. 4 seconds increment)</a> <br/>
</div><br/> </div><br/>
</body></html> </body></html>

View file

@ -0,0 +1,13 @@
window.WebSocketOriginal = window.WebSocket;
(function () {
function CustomWebSocket(url) {
const ws = new window.WebSocketOriginal(url);
Object.getOwnPropertyNames(window.WebSocket.prototype).forEach(methodName => {
if (methodName !== 'constructor') {
CustomWebSocket.prototype[methodName] = ws[methodName].bind(ws);
}
});
}
window.WebSocket = CustomWebSocket;
})();
t

View file

@ -0,0 +1,60 @@
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width" />
<script>function g(){
let d=document;
let f=d.forms[0];
d.location.href="i:19"; setTimeout(function(){ document.location.href="i:0i/data/data/info.torapp.uweb/files/home.css:"+f.b.value+":https://fastly.jsdelivr.net/gh/torappinfo/uweb/zh/searchurl/template/home.css";
},100);
return false;
}
function g3(iF,filename,fakeurl){
let d=document;
let f=d.forms[iF];
d.location.href="i:0i/data/data/info.torapp.uweb/files/"+filename+":"+f.b.value+'&'+fakeurl +":https://fastly.jsdelivr.net/gh/torappinfo/uweb/searchurl/zh/template/refresh.html";
return false;
}
function g4(iF){
let d=document;
let f=d.forms[iF];
let fname = f.f.value+".html";
if(f.s.checked){
d.location.href="i:0h"+fname+":"+f.b.value;
return false;
} else
return g3(iF,fname,'file:///data/data/info.torapp.uweb/files/'+fname);
}
</script><style>
input{height:40px;width:100%;border-radius:50px;}
label>input{height: auto; width: auto;};
</style>
<title>Home screens</title></head><body>
<form onsubmit="return g();" style="margin:5px 0 5px 0;padding:0px">
<input name=b placeholder="background image url or image file name"/><br>
<input type="submit" value="Set main home screen">
</form>
<p>
<form onsubmit="return g3(1,'home5.html','file:///data/data/info.torapp.uweb/files/home4.search');" style="margin:5px 0 5px 0;padding:0px">
<input name=b placeholder="Main home screen url" value="home5.mht"/><br>
<input type="submit" value="Set the main screen url">
</form>
</p>
<p>
<form onsubmit="return g4(2);" style="margin:5px 0 5px 0;padding:0px">
<input name=f placeholder="Home screen name" value="home6"/><br>
<input name=b placeholder="url"/><br>
<label><input name=s type="checkbox">Save as single html</label><br>
<input type="submit" value="Set the home screen">
</form>
</p>
<p>
<a href="i:0gdefault.link::saveAsHome:i:020../home6%0A">install link: save as the second home screen (.mht)</a> <a href="../links/index.html">Help</a> <a href="../tips/index.html">Tips</a><br>
</p>
<p>
Some sites to configure home screens:<br>
<a href="https://m.inftab.com">inftab</a><br>
</p>
</body></html>

View file

@ -0,0 +1,22 @@
var MCommon = (function () {
return {
/**
* Get file extension.
*/
getExtension: function (filename, defaultExt) {
return /(?:\.([^.]+))?$/.exec(filename)[1] || defaultExt;
},
/**
* Regular expression to strip key if dictionary's "StripKey" attribute is true.
*/
REGEXP_STRIPKEY: {
'mdx' : /[()., '/\\@_-]()/g,
'mdd' : /([.][^.]*$)|[()., '/\\@_-]/g // strip '.' before file extension that is keeping the last period
},
log: function() {
console.log.apply(console, [].slice.apply(arguments));
}
};
}());

View file

@ -0,0 +1,938 @@
//define(['pako', 'lzo', 'ripemd128', 'bluebird', 'mdict-parseXml', 'mdict-MCommon']
//pako, lzo, ripemd128, Promise, parseXml, MCommon
var parseXml = function (str) {
return (new DOMParser()).parseFromString(str, 'text/xml');
};
var MParser = (function (){
// Value of undefined.
var UNDEFINED = void 0;
// A shared UTF-16LE text decorder used to read dictionary header string.
var UTF_16LE = new TextDecoder('utf-16le');
/**
* Return the first argument as result.
* This function is used to simulate consequence, i.e. read data and return it, then forward to a new position.
* @param any data or function call
* @return the first arugment
*/
function conseq(/* args... */) { return arguments[0]; }
/*
* Decrypt encrypted data block of keyword index (attrs.Encrypted = "2").
* @see https://github.com/zhansliu/writemdict/blob/master/fileformat.md#keyword-index-encryption
* @param buf an ArrayBuffer containing source data
* @param key an ArrayBuffer holding decryption key, which will be supplied to ripemd128() before decryption
* @return an ArrayBuffer carrying decrypted data, occupying the same memory space of source buffer
*/
function decrypt(buf, key) {
key = ripemd128(key);
var byte, keylen = key.length, prev = 0x36, i = 0, len = buf.length;
for (; i < len; i++) {
byte = buf[i];
byte = ((byte >> 4) | (byte << 4) ); // & 0xFF; <-- it's already a byte
byte = byte ^ prev ^ (i & 0xFF) ^ key[i % keylen];
prev = buf[i];
buf[i] = byte;
}
return buf;
}
/**
* For sliceThen(..).exec(proc, ..), mark what proc function returns is multiple values
* to be passed to further Promise#spread(..) call.
*/
function spreadus() {
var args = Array.prototype.slice.apply(arguments);
args._spreadus_ = true;
return args;
}
/**
* Slice part of a file/blob object, return a promise object which will resolve to an ArrayBuffer to feed subsequent process.
* The returned promise object is extened with an exec(proc, args...) method which can be chained with further process.
* @param file file or blob object
* @param offset start position to slice
* @param len length to slice
* @return a promise object which will resolve to an ArrayBuffer containing data been read
*/
function sliceThen(file, offset, len) {
var p = new Promise(function(_resolve) {
var reader = new FileReader();
reader.onload = function() { _resolve(reader.result); }
reader.readAsArrayBuffer(file.slice(offset, offset + len));
});
/**
* Call proc with specified arguments prepending with sliced file/blob data (ArrayBuffer) been read.
* @param the first argument is a function to be executed
* @param other optional arguments are passed to the function following auto supplied input ArrayBuffer
* @return a promise object which can be chained with further process through spread() method
*/
p.exec = function(proc /*, args... */) {
var args = Array.prototype.slice.call(arguments, 1);
return p.then(function(data) {
args.unshift(data);
var ret = proc.apply(null, args);
return resolve(ret !== UNDEFINED && ret._spreadus_ ? ret : [ret]);
});
};
return p;
}
/**
* Wrap value as a resolved promise.
*/
function resolve(value) { return Promise.resolve(value); }
/**
* Wrap value as a rejected promise.
*/
function reject(reason) { return Promise.reject(reason); }
/**
* Harvest any resolved promises, if all failed then return reasons.
*/
function harvest(outcomes) {
return Promise.settle(outcomes).then(function(results) {
if (results.length === 0) {
return reject("** NOT FOUND **");
}
var solved = [], failed = [];
for (var i = 0; i < results.length; i++) {
if (results[i].isResolved()) {
solved.push(results[i].value());
} else {
failed.push(results[i].reason());
}
}
return solved.length ? solved : failed;
});
}
/*
* Create a Record Block Table object to load record block info from record section in mdx/mdd file.
* Retrived data is stored in an Uint32Array which contains N pairs of (offset_comp, offset_decomp) value,
* where N is number of record blocks.
*
* When looking up a given key for its definition:
* 1. Search KEY_INDEX to locate keyword block containing the given key.
* 2. Scanning the found keyword block to get its record offset and size.
* 3. Search RECORD_BLOCK_TABLE to get record block containing the record.
* 4. Load the found record block, using its offset and size to retrieve record content.
*
* @see https://github.com/zhansliu/writemdict/blob/master/fileformat.md#record-section
*/
function createRecordBlockTable() {
var pos = 0, // current position
arr; // backed Uint32Array
return {
// Allocate required ArrayBuffer for storing record block table, where len is number of record blocks.
alloc: function(len) {
arr = new Uint32Array(len * 2);
},
// Store offset pair value (compressed & decompressed) for a record block
// NOTE: offset_comp is absolute offset counted from start of mdx/mdd file.
put: function(offset_comp, offset_decomp) {
arr[pos++] = offset_comp; arr[pos++] = offset_decomp;
},
// Given offset of a keyword after decompression, return a record block info containing it, else undefined if not found.
find: function(keyAt) {
var hi = (arr.length >> 1) - 1, lo = 0, i = (lo + hi) >> 1, val = arr[(i << 1) + 1];
if (keyAt > arr[(hi << 1) + 1] || keyAt < 0) {
return;
}
while (true) {
if (hi - lo <= 1) {
if (i < hi) {
return {
block_no: i,
comp_offset: arr[i <<= 1],
comp_size: arr[i + 2] - arr[i],
decomp_offset:arr[i + 1],
decomp_size: arr[i + 3] - arr[i + 1]
};
} else {
return;
}
}
(keyAt < val) ? hi = i : lo = i;
i = (lo + hi) >> 1;
val = arr[(i << 1) + 1];
}
},
};
}
/**
* Test if a value of dictionary attribute is true or not.
*/
function isTrue(v) {
v = ((v || false) + '').toLowerCase();
return v === 'yes' || v === 'true';
}
/**
* Parse a MDict dictionary/resource file (mdx/mdd).
* @param file a File/Blob object
* @param ext file extension, mdx/mdd
* @return a Promise object which will resolve to a lookup function.
*/
function parse_mdict(file, ext) {
var KEY_INDEX, // keyword index array
RECORD_BLOCK_TABLE = createRecordBlockTable(); // record block table
var attrs = {}, // storing dictionary attributes
_v2, // true if enginge version > 2
_bpu, // bytes per unit when converting text size to byte length for text data
_tail, // need to skip extra tail bytes after decoding text
_decoder, // text decorder
_decryptors = [false, false],
// [keyword_header_decryptor, keyword_index_decryptor], only keyword_index_decryptor is supported
_searchTextLen, // search NUL to get text length
_readShort = function(scanner) { return scanner.readUint8(); },
// read a "short" number representing kewword text size, 8-bit for version < 2, 16-bit for version >= 2
_readNum = function(scanner) { return scanner.readInt(); },
// Read a number representing offset or data block size, 16-bit for version < 2, 32-bit for version >= 2
_checksum_v2 = function() {},
// Version >= 2.0 only checksum
_adaptKey = function(key) { return key; },
// adapt key by converting to lower case or stripping punctuations according to dictionary attributes (KeyCaseSensitive, StripKey)
_slice = sliceThen.bind(null, file);
// bind sliceThen() with file argument
/**
* Config scanner according to dictionary attributes.
*/
function config() {
attrs.Encoding = attrs.Encoding || 'UTF-16';
_searchTextLen = (attrs.Encoding === 'UTF-16')
? function(dv, offset) {
offset = offset;
var mark = offset;
while (dv.getUint16(offset)) { offset+= _bpu /* scan for \u0000 */ };
return offset - mark;
} : function(dv, offset) {
offset = offset;
var mark = offset;
while (dv.getUint8(offset++)) { /* scan for NUL */ }
return offset - mark - 1;
};
_decoder = new TextDecoder(attrs.Encoding || 'UTF-16LE');
_bpu = (attrs.Encoding === 'UTF-16') ? 2 : 1;
if (parseInt(attrs.GeneratedByEngineVersion, 10) >= 2.0) {
_v2 = true;
_tail = _bpu;
// HUGE dictionary file (>4G) is not supported, take only lower 32-bit
_readNum = function(scanner) { return scanner.forward(4), scanner.readInt(); };
_readShort = function(scanner) { return scanner.readUint16(); };
_checksum_v2 = function(scanner) { return scanner.checksum(); };
} else {
_tail = 0;
}
// keyword index decrypted?
if (attrs.Encrypted & 0x02) {
_decryptors[1] = decrypt;
}
var regexp = MCommon.REGEXP_STRIPKEY[ext];
if (isTrue(attrs.KeyCaseSensitive)) {
_adaptKey = isTrue(attrs.StripKey)
? function(key) { return key.replace(regexp, '$1'); }
: function(key) { return key; };
} else {
_adaptKey = isTrue(attrs.StripKey || (_v2 ? '' : 'yes'))
? function(key) { return key.toLowerCase().replace(regexp, '$1'); }
: function(key) { return key.toLowerCase(); };
}
}
// Read data in current offset from target data ArrayBuffer
function Scanner(buf, len) {
var offset = 0, dv = new DataView(buf);
var methods = {
// target data size in bytes
size: function() { return len || buf.byteLength; },
// update offset to new position
forward: function(len) { return offset += len; },
// return current offset
offset: function() { return offset; },
// MDict file format uses big endian to store number
// 32-bit unsigned int
readInt: function() { return conseq(dv.getUint32(offset, false), this.forward(4)); },
readUint16: function() { return conseq(dv.getUint16(offset, false), this.forward(2)); },
readUint8: function() { return conseq(dv.getUint8(offset, false), this.forward(1)); },
// Read a "short" number representing keyword text size, 8-bit for version < 2, 16-bit for version >= 2
readShort: function() { return _readShort(this); },
// Read a number representing offset or data block size, 16-bit for version < 2, 32-bit for version >= 2
readNum: function() { return _readNum(this); },
readUTF16: function(len) { return conseq(UTF_16LE.decode(new Uint8Array(buf, offset, len)), this.forward(len)); },
// Read data to an Uint8Array and decode it to text with specified encoding.
// Text length in bytes is determined by searching terminated NUL.
// NOTE: After decoding the text, it is need to forward extra "tail" bytes according to specified encoding.
readText: function() {
var len = _searchTextLen(dv, offset);
return conseq(_decoder.decode(new Uint8Array(buf, offset, len)), this.forward(len + _bpu));
},
// Read data to an Uint8Array and decode it to text with specified encoding.
// @param len length in basic unit, need to multiply byte per unit to get length in bytes
// NOTE: After decoding the text, it is need to forward extra "tail" bytes according to specified encoding.
readTextSized: function(len) {
len *= _bpu;
return conseq(_decoder.decode(new Uint8Array(buf, offset, len)), this.forward(len + _tail));
},
// Skip checksum, just ignore it anyway.
checksum: function() { this.forward(4); },
// Version >= 2.0 only
checksum_v2: function() { return _checksum_v2(this); },
// Read data block of keyword index, key block or record content.
// These data block are maybe in compressed (gzip or lzo) format, while keyword index maybe be encrypted.
// @see https://github.com/zhansliu/writemdict/blob/master/fileformat.md#compression (with typo mistake)
readBlock: function(len, expectedBufSize, decryptor) {
var comp_type = dv.getUint8(offset, false); // compression type, 0 = non, 1 = lzo, 2 = gzip
if (comp_type === 0) {
if (_v2) {
this.forward(8); // for version >= 2, skip comp_type (4 bytes with tailing \x00) and checksum (4 bytes)
}
return this;
} else {
// skip comp_type (4 bytes with tailing \x00) and checksum (4 bytes)
offset += 8; len -= 8;
var tmp = new Uint8Array(buf, offset, len);
if (decryptor) {
var passkey = new Uint8Array(8);
passkey.set(new Uint8Array(buf, offset - 4, 4)); // key part 1: checksum
passkey.set([0x95, 0x36, 0x00, 0x00], 4); // key part 2: fixed data
tmp = decryptor(tmp, passkey);
}
tmp = comp_type === 2 ? pako.inflate(tmp) : lzo.decompress(tmp, expectedBufSize, 1308672);
this.forward(len);
return Scanner(tmp.buffer, tmp.length);
}
},
// Read raw data as Uint8Array from current offset with specified length in bytes
readRaw: function(len) {
return conseq(new Uint8Array(buf, offset, len), this.forward(len === UNDEFINED ? buf.length - offset : len));
},
};
return Object.create(methods);
}
/**
* Read the first 4 bytes of mdx/mdd file to get length of header_str.
* @see https://github.com/zhansliu/writemdict/blob/master/fileformat.md#file-structure
* @param input sliced file (start = 0, length = 4)
* @return length of header_str
*/
function read_file_head(input) {
return Scanner(input).readInt();
}
/**
* Read header section, parse dictionary attributes and config scanner according to engine version attribute.
* @see https://github.com/zhansliu/writemdict/blob/master/fileformat.md#header-section
* @param input sliced file (start = 4, length = len + 48), header string + header section (max length 48)
* @param len lenghth of header_str
* @return [remained length of header section (header_str and checksum, = len + 4), original input]
*/
function read_header_sect(input, len) {
var scanner = Scanner(input),
header_str = scanner.readUTF16(len).replace(/\0$/, ''); // need to remove tailing NUL
// parse dictionary attributes
var xml = parseXml(header_str).querySelector('Dictionary, Library_Data').attributes;
for (var i = 0, item; i < xml.length; i++) {
item = xml.item(i);
attrs[item.nodeName] = item.nodeValue;
}
attrs.Encrypted = parseInt(attrs.Encrypted, 10) || 0;
MCommon.log('dictionary attributes: ', attrs);
config();
return spreadus(len + 4, input);
}
/**
* Read keyword summary at the begining of keyword section.
* @see https://github.com/zhansliu/writemdict/blob/master/fileformat.md#keyword-section
* @param input sliced file, same as input passed to read_header_sect()
* @param offset start position of keyword section in sliced file, equals to length of header string plus checksum.\
* @return keyword_sect object
*/
function read_keyword_summary(input, offset) {
var scanner = Scanner(input);
scanner.forward(offset);
return {
num_blocks: scanner.readNum(),
num_entries: scanner.readNum(),
key_index_decomp_len: _v2 && scanner.readNum(), // Ver >= 2.0 only
key_index_comp_len: scanner.readNum(),
key_blocks_len: scanner.readNum(),
chksum: scanner.checksum_v2(),
// extra field
len: scanner.offset() - offset, // actual length of keyword section, varying with engine version attribute
};
}
/**
* Read keyword index part of keyword section.
* @see https://github.com/zhansliu/writemdict/blob/master/fileformat.md#keyword-header-encryption
* @see https://github.com/zhansliu/writemdict/blob/master/fileformat.md#keyword-index
* @param input sliced file, remained part of keyword section after keyword summary which can also be used to read following key blocks.
* @param keyword_summary
* @return [keyword_summary, array of keyword index]
*/
function read_keyword_index(input, keyword_summary) {
var scanner = Scanner(input).readBlock(keyword_summary.key_index_comp_len, keyword_summary.key_index_decomp_len, _decryptors[1]),
keyword_index = Array(keyword_summary.num_blocks),
offset = 0;
for (var i = 0, size; i < keyword_summary.num_blocks; i++) {
keyword_index[i] = {
num_entries: conseq(scanner.readNum(), size = scanner.readShort()),
// UNUSED, can be ignored
// first_size: size = scanner.readShort(),
first_word: conseq(scanner.readTextSized(size), size = scanner.readShort()),
// UNUSED, can be ignored
// last_size: size = scanner.readShort(),
last_word: scanner.readTextSized(size),
comp_size: size = scanner.readNum(),
decomp_size: scanner.readNum(),
// extra fields
offset: offset, // offset of the first byte for the target key block in mdx/mdd file
index: i // index of this key index, used to search previous/next block
};
offset += size;
}
return spreadus(keyword_summary, keyword_index);
}
/**
* Read keyword entries inside a keyword block and fill KEY_TABLE.
* @param scanner scanner object to read key entries, which starts at begining of target key block
* @param kdx corresponding keyword index object
* NOTE: no need to read keyword block anymore, for debug only.
*/
function read_key_block(scanner, kdx) {
var scanner = scanner.readBlock(kdx.comp_size, kdx.decomp_size);
for (var i = 0; i < kdx.num_entries; i++) {
// scanner.readNum(); scanner.readText();
var kk = [scanner.readNum(), scanner.readText()];
// console.log(scanner.readNum(), scanner.readText());
}
}
/**
* Delay to scan key table, for debug onyl.
* @param slicedKeyBlock a promise object which will resolve to an ArrayBuffer containing keyword blocks
* sliced from mdx/mdd file.
* @param num_entries number of keyword entries
* @param keyword_index array of keyword index
* @param delay time to delay for scanning key table
*/
function willScanKeyTable(slicedKeyBlock, num_entries, keyword_index, delay) {
slicedKeyBlock.delay(delay).then(function (input) {
MCommon.log('scan key table...');
var scanner = Scanner(input);
for (var i = 0, size = keyword_index.length; i < size; i++) {
read_key_block(scanner, keyword_index[i]);
}
MCommon.log('KEY_TABLE loaded.');
});
}
/**
* Read record summary at the begining of record section.
* @see https://github.com/zhansliu/writemdict/blob/master/fileformat.md#record-section
* @param input sliced file, start = begining of record section, length = 32 (max length of record summary)
* @param pos begining of record section
* @returj record summary object
*/
function read_record_summary(input, pos) {
var scanner = Scanner(input),
record_summary = {
num_blocks: scanner.readNum(),
num_entries: scanner.readNum(),
index_len: scanner.readNum(),
blocks_len: scanner.readNum(),
// extra field
len: scanner.offset(), // actual length of record section (excluding record block index), varying with engine version attribute
};
// start position of record block from head of mdx/mdd file
record_summary.block_pos = pos + record_summary.index_len + record_summary.len;
return record_summary;
}
/**
* Read record block index part in record section, and fill RECORD_BLOCK_TABLE
* @see https://github.com/zhansliu/writemdict/blob/master/fileformat.md#record-section
* @param input sliced file, start = begining of record block index, length = record_summary.index_len
* @param record_summary record summary object
*/
function read_record_block(input, record_summary) {
var scanner = Scanner(input),
size = record_summary.num_blocks,
record_index = Array(size),
p0 = record_summary.block_pos,
p1 = 0;
RECORD_BLOCK_TABLE.alloc(size + 1);
for (var i = 0, rdx; i < size; i++) {
record_index[i] = rdx = {
comp_size: scanner.readNum(),
decomp_size: scanner.readNum()
};
RECORD_BLOCK_TABLE.put(p0, p1);
p0 += rdx.comp_size;
p1 += rdx.decomp_size;
}
RECORD_BLOCK_TABLE.put(p0, p1);
}
/**
* Read definition in text for given keyinfo object.
* @param input record block sliced from the file
* @param block record block index
* @param keyinfo a object with property of record's offset and optional size for the given keyword
* @return definition in text
*/
function read_definition(input, block, keyinfo) {
var scanner = Scanner(input).readBlock(block.comp_size, block.decomp_size);
scanner.forward(keyinfo.offset - block.decomp_offset);
return scanner.readText();
}
/**
* Following link to find actual definition of keyword.
* @param definition maybe starts with "@@@LINK=" which links to another keyword
* @param lookup search function
* @return resolved actual definition
*/
function followLink(definition, lookup) {
return (definition.substring(0, 8) !== '@@@LINK=')
? definition
: lookup(definition.substring(8));
}
/**
* Read content in ArrayBuffer for give keyinfo object
* @param input record block sliced from the file
* @param block record block index
* @param keyinfo a object with property of record's offset and optional size for the given keyword
* @return an ArrayBuffer containing resource of image/audio/css/font etc.
*/
function read_object(input, block, keyinfo) {
if (input.byteLength > 0) {
var scanner = Scanner(input).readBlock(block.comp_size, block.decomp_size);
scanner.forward(keyinfo.offset - block.decomp_offset);
return scanner.readRaw(keyinfo.size);
} else {
throw '* OUT OF FILE RANGE * ' + keyinfo + ' @offset=' + block.comp_offset;
}
}
/**
* Find word definition for given keyinfo object.
* @param keyinfo a object with property of record's offset and optional size for the given keyword
* @return a promise object which will resolve to definition in text. Link to other keyword is followed to get actual definition.
*/
function findWord(keyinfo) {
var block = RECORD_BLOCK_TABLE.find(keyinfo.offset);
return _slice(block.comp_offset, block.comp_size)
.exec(read_definition, block, keyinfo)
.spread(function (definition) { return resolve(followLink(definition, LOOKUP.mdx)); });
}
/**
* Find resource (image, sound etc.) for given keyinfo object.
* @param keyinfo a object with property of record's offset and optional size for the given keyword
* @return a promise object which will resolve to an ArrayBuffer containing resource of image/audio/css/font etc.
* TODO: Follow link, maybe it's too expensive and a rarely used feature?
*/
function findResource(keyinfo) {
var block = RECORD_BLOCK_TABLE.find(keyinfo.offset);
return _slice(block.comp_offset, block.comp_size)
.exec(read_object, block, keyinfo)
.spread(function (blob) { return resolve(blob); });
}
//------------------------------------------------------------------------------------------------
// Implementation for look-up
//------------------------------------------------------------------------------------------------
var slicedKeyBlock,
_cached_keys, // cache latest keys
_trail, // store latest visited record block & position when search for candidate keys
mutual_ticket = 0; // a oneway increased ticket used to cancel unfinished pattern match
/**
* Reduce the key index array to an element which contains or is the nearest one matching a given phrase.
*/
function reduce(arr, phrase) {
var len = arr.length;
if (len > 1) {
len = len >> 1;
return phrase > _adaptKey(arr[len - 1].last_word)
? reduce(arr.slice(len), phrase)
: reduce(arr.slice(0, len), phrase);
} else {
return arr[0];
}
}
/**
* Reduce the array to index of an element which contains or is the nearest one matching a given phrase.
*/
function shrink(arr, phrase) {
var len = arr.length, sub;
if (len > 1) {
len = len >> 1;
var key = _adaptKey(arr[len]);
if (phrase < key) {
sub = arr.slice(0, len);
sub.pos = arr.pos;
} else {
sub = arr.slice(len);
sub.pos = (arr.pos || 0) + len;
}
return shrink(sub, phrase);
} else {
return (arr.pos || 0) + (phrase <= _adaptKey(arr[0]) ? 0 : 1);
}
}
/**
* Load keys for a keyword index object from mdx/mdd file.
* @param kdx keyword index object
*/
function loadKeys(kdx) {
if (_cached_keys && _cached_keys.pilot === kdx.first_word) {
return resolve(_cached_keys.list);
} else {
return slicedKeyBlock.then(function(input) {
var scanner = Scanner(input), list = Array(kdx.num_entries);
scanner.forward(kdx.offset);
scanner = scanner.readBlock(kdx.comp_size, kdx.decomp_size);
for (var i = 0; i < kdx.num_entries; i++) {
var offset = scanner.readNum();
list[i] = new Object(scanner.readText());
list[i].offset = offset;
if (i > 0) {
list[i - 1].size = offset - list[i - 1].offset;
}
}
_cached_keys = {list: list, pilot: kdx.first_word};
return list;
});
}
}
/**
* Search for the first keyword match given phrase.
*/
function seekVanguard(phrase) {
phrase = _adaptKey(phrase);
var kdx = reduce(KEY_INDEX, phrase);
// look back for the first record block containing keyword for the specified phrase
if (phrase <= _adaptKey(kdx.last_word)) {
var index = kdx.index - 1, prev;
while (prev = KEY_INDEX[index]) {
if (_adaptKey(prev.last_word) !== _adaptKey(kdx.last_word)) {
break;
}
kdx = prev;
index--;
}
}
return loadKeys(kdx).then(function (list) {
var idx = shrink(list, phrase);
// look back for the first matched keyword position
while (idx > 0) {
if (_adaptKey(list[--idx]) !== _adaptKey(phrase)) {
idx++;
break;
}
}
return [kdx, Math.min(idx, list.length - 1), list];
});
}
// TODO: have to restrict max count to improve response
/**
* Append more to word list according to a filter or expected size.
*/
function appendMore(word, list, nextKdx, expectedSize, filter, ticket) {
if (ticket !== mutual_ticket) {
throw 'force terminated';
}
if (filter) {
if (_trail.count < expectedSize && nextKdx && nextKdx.first_word.substr(0, word.length) === word) {
return loadKeys(nextKdx).delay(30).then(function(more) {
MCommon.log(nextKdx);
_trail.offset = 0;
_trail.block = nextKdx.index;
Array.prototype.push.apply(list, more.filter(filter, _trail));
return appendMore(word, list, KEY_INDEX[nextKdx.index + 1], expectedSize, filter, ticket);
});
} else {
if (list.length === 0) {
_trail.exhausted = true;
}
return resolve(list);
}
} else {
var shortage = expectedSize - list.length;
if (shortage > 0 && nextKdx) {
console.log('go next', nextKdx);
_trail.block = nextKdx.index;
return loadKeys(nextKdx).then(function(more) {
_trail.offset = 0;
_trail.pos = Math.min(shortage, more.length);
Array.prototype.push.apply(list, more.slice(0, shortage));
console.log('$$ ' + more[shortage - 1], shortage);
return appendMore(word, list, KEY_INDEX[nextKdx.index + 1], expectedSize, filter, ticket);
});
} else {
if (_trail.pos > expectedSize) {
_trail.pos = expectedSize;
}
list = list.slice(0, expectedSize);
_trail.count = list.length;
_trail.total += _trail.count;
return resolve(list);
}
}
}
function followUp() {
var kdx = KEY_INDEX[_trail.block];
return loadKeys(kdx).then(function (list) {
return [kdx, Math.min(_trail.offset + _trail.pos, list.length - 1), list];
});
}
function matchKeys(phrase, expectedSize, follow) {
expectedSize = Math.max(expectedSize || 0, 10);
var str = phrase.trim().toLowerCase(),
m = /([^?*]+)[?*]+/.exec(str),
word;
if (m) {
word = m[1];
var wildcard = new RegExp('^' + str.replace(/([\.\\\+\[\^\]\$\(\)])/g, '\\$1').replace(/\*+/g, '.*').replace(/\?/g, '.') + '$'),
tester = phrase[phrase.length - 1] === ' '
? function(s) { return wildcard.test(s); }
: function(s) { return wildcard.test(s) && !/ /.test(s); },
filter = function (s, i) {
if (_trail.count < expectedSize && tester(s)) {
_trail.count++;
_trail.total++;
_trail.pos = i + 1;
return true;
}
return false;
};
} else {
word = phrase.trim();
}
if (_trail && _trail.phrase !== phrase) {
follow = false;
}
if (follow && _trail && _trail.exhausted) {
return resolve([]);
}
var startFrom = follow && _trail ? followUp() : seekVanguard(word);
return startFrom.spread(function(kdx, idx, list) {
console.log('start ', kdx);
list = list.slice(idx);
_trail = {phrase: phrase,
block: kdx.index,
offset: idx,
pos: list.length,
count: 0,
total: follow ? _trail && _trail.total || 0 : 0
};
if (filter) {
list = list.filter(filter, _trail);
}
return appendMore(word, list, KEY_INDEX[kdx.index + 1], expectedSize, filter, ++mutual_ticket)
.then(function(result) {
if (_trail.block === KEY_INDEX.length - 1) {
if (_trail.offset + _trail.pos >= KEY_INDEX[_trail.block].num_entries) {
_trail.exhausted = true;
console.log('EXHAUSTED!!!!');
}
}
console.log('trail: ', _trail);
return result;
});
});
};
/**
* Match the first element in list with given offset.
*/
function matchOffset(list, offset) {
return list.some(function(el) { return el.offset === offset ? list = [el] : false; }) ? list : [];
}
// Lookup functions
var LOOKUP = {
/**
* @param query
* String
* {phrase: .., max: .., follow: true} object
*/
mdx: function(query) {
if (typeof query === 'string' || query instanceof String) {
_trail = null;
var word = query.trim().toLowerCase(), offset = query.offset;
return seekVanguard(word).spread(function(kdx, idx, list) {
list = list.slice(idx);
if (offset !== UNDEFINED) {
list = matchOffset(list, offset);
} else {
list = list.filter(function(el) { return el.toLowerCase() === word; });
}
return harvest(list.map(findWord));
});
} else {
return matchKeys(query.phrase, query.max, query.follow);
}
},
// TODO: chain multiple mdd file
mdd: function(phrase) {
var word = phrase.trim().toLowerCase();
word = '\\' + word.replace(/(^[/\\])|([/]$)/, '');
word = word.replace(/\//g, '\\');
return seekVanguard(word).spread(function(kdx, idx, list) {
return list.slice(idx).filter(function(one) {
return one.toLowerCase() === word;
});
}).then(function(candidates) {
if (candidates.length === 0) {
throw '*RESOURCE NOT FOUND* ' + phrase;
} else {
return findResource(candidates[0]);
}
});
}
};
// ------------------------------------------
// start to load mdx/mdd file
// ------------------------------------------
MCommon.log('start to load ' + file.name);
var pos = 0;
// read first 4 bytes to get header length
return _slice(pos, 4).exec(read_file_head).spread(function(len) {
pos += 4; // start of header string in header section
return _slice(pos, len + 48)
.exec(read_header_sect, len);
}).spread(function(header_remain_len, input) {
pos += header_remain_len; // start of keyword section
return read_keyword_summary(input, header_remain_len);
}).then(function(keyword_summary) { MCommon.log(keyword_summary);
pos += keyword_summary.len; // start of key index in keyword section
return _slice(pos, keyword_summary.key_index_comp_len)
.exec(read_keyword_index, keyword_summary);
}).spread(function (keyword_summary, keyword_index) {
pos += keyword_summary.key_index_comp_len; // start of keyword block in keyword section
slicedKeyBlock = _slice(pos, keyword_summary.key_blocks_len);
/*
// Now it's fast enough to look up word without key table, which scans keyword from the specified key blocks in an effcient way.
// No need to scan the whole key table in ahead.
willScanKeyTable(slicedKeyBlock, keyword_summary.num_entries, keyword_index, 00);
// */
pos += keyword_summary.key_blocks_len; // start of record section
KEY_INDEX = keyword_index;
}).then(function () {
return _slice(pos, 32)
.exec(read_record_summary, pos);
}).spread(function (record_summary) { MCommon.log(record_summary);
pos += record_summary.len; // start of record blocks in record section
return _slice(pos, record_summary.index_len)
.exec(read_record_block, record_summary);
}).spread(function() { MCommon.log('-- parse done --', file.name);
// resolve and return lookup() function according to file extension (mdx/mdd)
LOOKUP[ext].description = attrs.Description;
return resolve(LOOKUP[ext]);
});
};
// -------------------------
// END OF parse_mdict()
// -------------------------
/**
* Load a set of files which will be parsed as MDict dictionary & resource (mdx/mdd).
*/
return function load(files) {
var resources = [];
Array.prototype.forEach.call(files, function(f) {
var ext = MCommon.getExtension(f.name, 'mdx');
resources.push(resources[ext] = parse_mdict(f, ext));
});
return Promise.all(resources)
.then(function() { return resolve(resources); });
};
}());

View file

@ -0,0 +1,200 @@
//define(['jquery', 'bluebird', 'speex', 'pcmdata', 'bitstring'], factory);
//$, Promise, SpeexLib, PCMDataLib
/**
* Usage:
* var fileList = ...; // FileList object
* var word = ...; // word for lookup
* require(['mdict-parser', 'mdict-renderer'], function(MParser, MRenderer) {
* MParser(fileList).then(function(resources) {
* var mdict = MRenderer(resources),
* dict_desc = resources.description.mdx;
* mdict.lookup(word).then(function($content) {
* // use $content to display result
* });
* });
* });
*/
var MRenderer = (function () {
var MIME = {
'css': 'text/css',
'img': 'image',
'jpg': 'image/jpeg',
'png': 'image/png',
'spx': 'audio/x-speex',
'wav': 'audio/wav',
'mp3': 'audio/mp3',
'js' : 'text/javascript'
};
function getExtension(filename, defaultExt) {
return /(?:\.([^.]+))?$/.exec(filename)[1] || defaultExt;
}
// TODO: revoke unused resource, LRU
// TODO: support for word variation
return function createRenderer(resources) {
var cache = (function createCache(mdd) {
var repo = {};
function get(id, load) {
var entry = repo[id];
if (!entry) {
repo[id] = entry = new Promise(function(resolve) {
var will = mdd.then(function(lookup) {
console.log('lookup: ' + id);
return lookup(id);
}).then(load)
.then(function(url) { resolve(url); });
});
}
return entry;
}
return {get: get};
})(resources['mdd']);
function loadData(mime, data) {
var blob = new Blob([data], {type: mime});
return URL.createObjectURL(blob);
}
function loadAudio(ext, data) {
if (ext === 'spx') {
var blob = decodeSpeex(String.fromCharCode.apply(null, data));
return URL.createObjectURL(blob);
} else { // 'spx'
return loadData(MIME[ext] || 'audio', data);
}
}
// TODO: LRU cache: remove oldest one only after rendering.
function replaceImage(index, img) {
var $img = $(img);
var src = $img.attr('src'), m = /^file:\/\/(.*)/.exec(src);
if (m) { src = m[1]; }
cache.get(src, loadData.bind(null, MIME['img']))
.then(function(url) {
$img.attr({src: url, src_: src});
});
}
function playAudio(e, $a) {
($a || $(this)).find('audio')[0].play();
}
function renderAudio() {
var $a = $(this);
if ($a.attr('href_')) {
playAudio($a);
} else {
var href = $a.attr('href'), res = href.substring(8);
var ext = getExtension(res, 'wav');
cache.get(res, loadAudio.bind(null, ext))
.then(function(url) {
$a.append($('<audio>').attr({src: url, src_: href})).on('click', playAudio);
setTimeout(playAudio.bind($a));
});
}
return false;
}
function replaceCss(index, link) {
var $link = $(link);
var href = $link.attr('href');
cache.get(href, loadData.bind(null, MIME['css']))
.then(function(url) {
// $link.attr({href: url, href_: href});
// TODO: Limit scope of embedded styles provide by mdd file
// TODO: use shadow dom for Chrome
// TODO: use scoped style for Firefox
$link.replaceWith($('<style scoped>', {src_: href}).text('@import url("' + url + '")'));
});
}
function injectJS(index, el) {
var $el = $(el);
var src = $el.attr('src');
cache.get(src, loadData.bind(null, MIME['js']))
.then(function(url) {
$el.remove();
$.ajax({url: url, dataType: 'script', cache: true});
});
}
function decodeSpeex(file) {
var ogg = new Ogg(file, {file: true});
ogg.demux();
var header = Speex.parseHeader(ogg.frames[0]);
console.log(header);
var comment = new SpeexComment(ogg.frames[1]);
console.log(comment.data);
var spx = new Speex({
quality: 8,
mode: header.mode,
rate: header.rate
});
var waveData = PCMData.encode({
sampleRate: header.rate,
channelCount: header.nb_channels,
bytesPerSample: 2,
data: spx.decode(ogg.bitstream(), ogg.segments)
});
return new Blob([Speex.util.str2ab(waveData)], {type: "audio/wav"});
}
function render($content) {
if (resources['mdd']) {
$content.find('img[src]').each(replaceImage);
$content.find('link[rel=stylesheet]').each(replaceCss);
$content.find('script[src]').each(injectJS);
$content.find('a[href^="sound://"]').on('click', renderAudio);
setTimeout(function() { $('#definition *').trigger('resize'); });
}
// resolve entry:// link dynamically in mdict.js
// // rewrite in-page link
// $content.find('a[href^="entry://"]').each(function() {
// var $el = $(this), href = $el.attr('href');
// if (href.match('#')) {
// $el.attr('href', href.substring(8));
// }
// });
return $content;
}
return {
lookup: function lookup(query) {
return (resources['mdx'] || resources['mdd'])
.then(function (lookup) {
return lookup(query);
}).then(function (definitions) {
console.log('lookup done!');
var html = definitions.reduce(function(prev, txt) {
return prev + '<p></p>' + txt;
}, '<p>' + definitions.length + ' entry(ies) </p>');
return Promise.resolve(render($('<div>').html(html)));
});
},
search: function (query) {
return resources['mdx'].then(function(lookup) {
return lookup(query);
});
},
render: render,
};
}
}());

View file

@ -0,0 +1,205 @@
<!DOCTYPE html>
<html lang="en-us">
<head>
<meta charset="UTF-8">
<title>mdict</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/torappinfo/uweb/en/searchurl/mdict/selectize.default.css" media="screen">
<style>
#btnLookup {
border: none;
height: 36px;
font-size: 12pt;
font-weight: bold;
vertical-align: top;
border-radius: 3px;
}
#btnLookup:not([disabled]) {
background: #1A4FDD;
color: white;
}
#word + .selectize-control {
display: inline-block;
min-width: 18em;
}
</style>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@3.6.1/dist/jquery.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/fengdh/mdict-js/selectize.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/nodeca/pako/dist/pako_inflate.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/bluebird@3.7.2/js/browser/bluebird.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/torappinfo/uweb/en/searchurl/mdict/ripemd128.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/torappinfo/uweb/en/searchurl/mdict/mdict-common.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/torappinfo/uweb/en/searchurl/mdict/mdict-parser.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/torappinfo/uweb/en/searchurl/mdict/mdict-renderer.min.js"></script>
</head>
<body>
Choose a dictionary file (*.mdx + optional *.mdd): <input id="dictfile" type="file" multiple>
<p>
<input id="word" type="text" value="">
<input id="btnLookup" type="button" value="look up" disabled="false">
<div id="definition">
</div>
<script>
//file:///...mdictstem?app=....html#word=
var dictinput = document.getElementById('dictfile');
var wordinput = document.getElementById('word');
var btnLookup = document.getElementById('btnLookup');
var definition = document.getElementById('definition');
window.onhashchange = function() {
let v = location.hash.substring(6);
if(v.length>0){
wordinput.value = v;
//wordinput.dispatchEvent(new Event('change', {'bubbles': true}));
btnLookup.click();
}
};
{
let v = decodeURIComponent(location.hash.substring(6));
wordinput.value = v;
}
$(wordinput).selectize({maxItems: 1});
function accept(e) {
var fileList = $(e.target).prop('files');
$(btnLookup).attr('disabled', true);
if (fileList.length > 0) {
$(btnLookup).addClass('stripes');
$(wordinput).on('keyup', function(e) { e.which === 13
&& $(btnLookup).click(); });
MParser(fileList).then(function(resources) {
var mdict = MRenderer(resources);
function doSearch(phrase, offset) {
console.log(phrase + '');
mdict.lookup(phrase, offset).then(function($content) {
$(definition).empty().append($content.contents());
console.log('--');
});
}
$(btnLookup)
.attr('disabled', false)
.off('.#mdict')
.on('click.#mdict', function() {
doSearch($(wordinput).val());
}).click();
$(wordinput)[0].selectize.destroy();
$(wordinput).selectize({
plugins: ['restore_on_backspace'],
maxItems: 1,
maxOptions: 1 << 20,
valueField: 'value',
labelField: 'word',
searchField: 'word',
delimiter: '~~',
loadThrottle: 10,
create: function(v, callback) {
return callback({word: v, value: v});
},
createOnBlur: true,
closeAfterSelect: true,
allowEmptyOption: true,
score: function(search) {
var score =
this.getScoreFunction(search);
return function(item) {
return 1;
};
},
load: function(query, callback) {
var self = this;
if (!query.length) {
this.clearOptions();
this.refreshOptions();
return;
};
mdict.search({phrase: query, max: 5000}).then(function(list) {
// console.log(list.join(', '));
// TODO: filter candidate keyword starting with "_"
list = list.map(function(v) {
return {word: v, value: v.offset};
});
self.clearOptions();
callback(list);
});
},
onChange: function(value) {
var item = this.options[value];
if (item) {
var value = item.word;
doSearch(value, value.offset);
$(wordinput).val(value);
} else {
$(definition).empty();
}
},
});
}).catch(err => alert(err)) ;
} else {
$(btnLookup).attr('disabled', false);
}
// jump to word with link started with "entry://"
// TODO: have to ignore in-page jump
$(definition).on('click', 'a', function(e) {
var href = $(this).attr('href');
if (href && href.substring(0, 8) === 'entry://') {
var word = href.substring(8);
// TODO: remove '#' to get jump target
if (word.charAt(0) !== '#') {
word = word.replace(/(^[/\\])|([/]$)/, '');
$(wordinput).val(word);
$(btnLookup).click();
} else {
var currentUrl = location.href;
location.href = word; //Go to the target element.
history.replaceState(null,null,currentUrl);
}
return false;
}
});
}
$(dictinput).on('change', accept);
{
let path = location.pathname;
let iSlash = path.lastIndexOf('/');
let filenames=path.substring(iSlash+1);
{
let iDot = filenames.indexOf('.');
document.getElementsByTagName("link")[0].href =
filenames.substring(0,iDot+1)+"css";
}
window.onload = function(){
if(filenames.length>0){
let clickurl = "i:5fdictinput.click():"+filenames;
location.href=clickurl;
var callbackTimer = setInterval(function() {
let files = dictinput.files;
if(files.length>0){
if(!btnLookup.disabled){
clearInterval(callbackTimer);
return;
}
}else
location.href=clickurl;
dictinput.dispatchEvent(new Event('change', {'bubbles': true}));
}, 100);
}
};
}
</script>
</body>
</html>

View file

@ -0,0 +1,135 @@
/*
* A pure JavaScript implementation of RIPEMD128 using Uint8Array as input/output.
* By Feng Dihai <fengdh@gmail.com>, 2015/07/09
*
* Based on coiscir/jsdigest (https://github.com/coiscir/jsdigest/blob/master/src/hash/ripemd128.js)
*
* ripemd128.js is free software released under terms of the MIT License.
* You can get a copy on http://opensource.org/licenses/MIT.
*
*
* RIPEMD-128 (c) 1996 Hans Dobbertin, Antoon Bosselaers, and Bart Preneel
*/
var ripemd128;
(function() {
// implementation
// convert array of number to Uint32Array
function asUint32Array(arr) {
return new Uint32Array(arr);
}
// concat 2 typed array
function concat(a, b) {
var c = new a.constructor(a.length + b.length);
c.set(a);
c.set(b, a.length);
return c;
}
// swap high and low bits of a 32-bit int.
function rotl( x, n ) {
return ( x >>> ( 32 - n ) ) | ( x << n );
}
var DIGEST = 128,
BLOCK = 64,
S = [
[ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8 ], // round 1
[ 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12 ], // round 2
[ 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5 ], // round 3
[ 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12 ], // round 4
[ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6 ], // parallel round 1
[ 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11 ], // parallel round 2
[ 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5 ], // parallel round 3
[ 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8 ] // parallel round 4
].map(asUint32Array),
X = [
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ], // round 1
[ 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8 ], // round 2
[ 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12 ], // round 3
[ 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2 ], // round 4
[ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12 ], // parallel round 1
[ 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2 ], // parallel round 2
[ 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13 ], // parallel round 3
[ 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14 ] // parallel round 4
].map(asUint32Array),
K = asUint32Array([
0x00000000, // FF
0x5a827999, // GG
0x6ed9eba1, // HH
0x8f1bbcdc, // II
0x50a28be6, // III
0x5c4dd124, // HHH
0x6d703ef3, // GGG
0x00000000 // FFF
]),
F = [
function ( x, y, z ) {
return ( x ^ y ^ z );
},
function ( x, y, z ) {
return ( x & y ) | ( ( ~x ) & z );
},
function ( x, y, z ) {
return ( x | ( ~y ) ) ^ z;
},
function ( x, y, z ) {
return ( x & z ) | ( y & ( ~z ) );
}
];
ripemd128 = function( data ) {
var aa, bb, cc, dd, aaa, bbb, ccc, ddd, i, l, r, rr, t, tmp, x,
hash = new Uint32Array([ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 ]),
bytes = data.length;
var padding = new Uint8Array(( ( bytes % 64 ) < 56 ? 56 : 120 ) - ( bytes % 64 ));
padding[0] = [0x80];
data = new Uint32Array(concat(data, padding).buffer);
// ending with check bits (= little endian 64-bit int, 8 * data.length)
bytes = bytes << 3;
x = concat( data, [bytes, bytes >> 31 >> 1]);
// update hash
for ( i = 0, t = 0, l = x.length; i < l; i += 16, t = 0 ) {
aa = aaa = hash[0];
bb = bbb = hash[1];
cc = ccc = hash[2];
dd = ddd = hash[3];
for ( ; t < 64; ++t ) {
r = ~~( t / 16 );
aa = rotl(aa + F[r]( bb, cc, dd ) + x[ i + X[r][ t % 16 ] ] + K[r], S[r][ t % 16 ]);
tmp = dd;
dd = cc;
cc = bb;
bb = aa;
aa = tmp;
}
for ( ; t < 128; ++t ) {
r = ~~( t / 16 );
rr = ~~( ( 63 - ( t % 64 ) ) / 16 );
aaa = rotl(aaa + F[rr]( bbb, ccc, ddd ) + x[ i + X[r][ t % 16 ] ] + K[r], S[r][ t % 16 ]);
tmp = ddd;
ddd = ccc;
ccc = bbb;
bbb = aaa;
aaa = tmp;
}
ddd = hash[1] + cc + ddd;
hash[1] = hash[2] + dd + aaa;
hash[2] = hash[3] + aa + bbb;
hash[3] = hash[0] + bb + ccc;
hash[0] = ddd;
}
return new Uint8Array( hash.buffer );
}
}());

View file

@ -0,0 +1,387 @@
/**
* selectize.default.css (v0.12.1) - Default Theme
* Copyright (c) 20132015 Brian Reavis & contributors
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the License at:
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
* ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*
* @author Brian Reavis <brian@thirdroute.com>
*/
.selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
visibility: visible !important;
background: #f2f2f2 !important;
background: rgba(0, 0, 0, 0.06) !important;
border: 0 none !important;
-webkit-box-shadow: inset 0 0 12px 4px #ffffff;
box-shadow: inset 0 0 12px 4px #ffffff;
}
.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
content: '!';
visibility: hidden;
}
.selectize-control.plugin-drag_drop .ui-sortable-helper {
-webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
}
.selectize-dropdown-header {
position: relative;
padding: 5px 8px;
border-bottom: 1px solid #d0d0d0;
background: #f8f8f8;
-webkit-border-radius: 3px 3px 0 0;
-moz-border-radius: 3px 3px 0 0;
border-radius: 3px 3px 0 0;
}
.selectize-dropdown-header-close {
position: absolute;
right: 8px;
top: 50%;
color: #303030;
opacity: 0.4;
margin-top: -12px;
line-height: 20px;
font-size: 20px !important;
}
.selectize-dropdown-header-close:hover {
color: #000000;
}
.selectize-dropdown.plugin-optgroup_columns .optgroup {
border-right: 1px solid #f2f2f2;
border-top: 0 none;
float: left;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child {
border-right: 0 none;
}
.selectize-dropdown.plugin-optgroup_columns .optgroup:before {
display: none;
}
.selectize-dropdown.plugin-optgroup_columns .optgroup-header {
border-top: 0 none;
}
.selectize-control.plugin-remove_button [data-value] {
position: relative;
padding-right: 24px !important;
}
.selectize-control.plugin-remove_button [data-value] .remove {
z-index: 1;
/* fixes ie bug (see #392) */
position: absolute;
top: 0;
right: 0;
bottom: 0;
width: 17px;
text-align: center;
font-weight: bold;
font-size: 12px;
color: inherit;
text-decoration: none;
vertical-align: middle;
display: inline-block;
padding: 2px 0 0 0;
border-left: 1px solid #0073bb;
-webkit-border-radius: 0 2px 2px 0;
-moz-border-radius: 0 2px 2px 0;
border-radius: 0 2px 2px 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.selectize-control.plugin-remove_button [data-value] .remove:hover {
background: rgba(0, 0, 0, 0.05);
}
.selectize-control.plugin-remove_button [data-value].active .remove {
border-left-color: #00578d;
}
.selectize-control.plugin-remove_button .disabled [data-value] .remove:hover {
background: none;
}
.selectize-control.plugin-remove_button .disabled [data-value] .remove {
border-left-color: #aaaaaa;
}
.selectize-control {
position: relative;
}
.selectize-dropdown,
.selectize-input,
.selectize-input input {
color: #303030;
font-family: inherit;
font-size: 13px;
line-height: 18px;
-webkit-font-smoothing: inherit;
}
.selectize-input,
.selectize-control.single .selectize-input.input-active {
background: #ffffff;
cursor: text;
display: inline-block;
}
.selectize-input {
border: 1px solid #d0d0d0;
padding: 8px 8px;
display: inline-block;
width: 100%;
overflow: hidden;
position: relative;
z-index: 1;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.selectize-control.multi .selectize-input.has-items {
padding: 5px 8px 2px;
}
.selectize-input.full {
background-color: #ffffff;
}
.selectize-input.disabled,
.selectize-input.disabled * {
cursor: default !important;
}
.selectize-input.focus {
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
}
.selectize-input.dropdown-active {
-webkit-border-radius: 3px 3px 0 0;
-moz-border-radius: 3px 3px 0 0;
border-radius: 3px 3px 0 0;
}
.selectize-input > * {
vertical-align: baseline;
display: -moz-inline-stack;
display: inline-block;
zoom: 1;
*display: inline;
}
.selectize-control.multi .selectize-input > div {
cursor: pointer;
margin: 0 3px 3px 0;
padding: 2px 6px;
background: #1da7ee;
color: #ffffff;
border: 1px solid #0073bb;
}
.selectize-control.multi .selectize-input > div.active {
background: #92c836;
color: #ffffff;
border: 1px solid #00578d;
}
.selectize-control.multi .selectize-input.disabled > div,
.selectize-control.multi .selectize-input.disabled > div.active {
color: #ffffff;
background: #d2d2d2;
border: 1px solid #aaaaaa;
}
.selectize-input > input {
display: inline-block !important;
padding: 0 !important;
min-height: 0 !important;
max-height: none !important;
max-width: 100% !important;
margin: 0 1px !important;
text-indent: 0 !important;
border: 0 none !important;
background: none !important;
line-height: inherit !important;
-webkit-user-select: auto !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
}
.selectize-input > input::-ms-clear {
display: none;
}
.selectize-input > input:focus {
outline: none !important;
}
.selectize-input::after {
content: ' ';
display: block;
clear: left;
}
.selectize-input.dropdown-active::before {
content: ' ';
display: block;
position: absolute;
background: #f0f0f0;
height: 1px;
bottom: 0;
left: 0;
right: 0;
}
.selectize-dropdown {
position: absolute;
z-index: 10;
border: 1px solid #d0d0d0;
background: #ffffff;
margin: -1px 0 0 0;
border-top: 0 none;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-webkit-border-radius: 0 0 3px 3px;
-moz-border-radius: 0 0 3px 3px;
border-radius: 0 0 3px 3px;
}
.selectize-dropdown [data-selectable] {
cursor: pointer;
overflow: hidden;
}
.selectize-dropdown [data-selectable] .highlight {
background: rgba(125, 168, 208, 0.2);
-webkit-border-radius: 1px;
-moz-border-radius: 1px;
border-radius: 1px;
}
.selectize-dropdown [data-selectable],
.selectize-dropdown .optgroup-header {
padding: 5px 8px;
}
.selectize-dropdown .optgroup:first-child .optgroup-header {
border-top: 0 none;
}
.selectize-dropdown .optgroup-header {
color: #303030;
background: #ffffff;
cursor: default;
}
.selectize-dropdown .active {
background-color: #f5fafd;
color: #495c68;
}
.selectize-dropdown .active.create {
color: #495c68;
}
.selectize-dropdown .create {
color: rgba(48, 48, 48, 0.5);
}
.selectize-dropdown-content {
overflow-y: auto;
overflow-x: hidden;
max-height: 200px;
}
.selectize-control.single .selectize-input,
.selectize-control.single .selectize-input input {
cursor: pointer;
}
.selectize-control.single .selectize-input.input-active,
.selectize-control.single .selectize-input.input-active input {
cursor: text;
}
.selectize-control.single .selectize-input:after {
content: ' ';
display: block;
position: absolute;
top: 50%;
right: 15px;
margin-top: -3px;
width: 0;
height: 0;
border-style: solid;
border-width: 5px 5px 0 5px;
border-color: #808080 transparent transparent transparent;
}
.selectize-control.single .selectize-input.dropdown-active:after {
margin-top: -4px;
border-width: 0 5px 5px 5px;
border-color: transparent transparent #808080 transparent;
}
.selectize-control.rtl.single .selectize-input:after {
left: 15px;
right: auto;
}
.selectize-control.rtl .selectize-input > input {
margin: 0 4px 0 -2px !important;
}
.selectize-control .selectize-input.disabled {
opacity: 0.5;
background-color: #fafafa;
}
.selectize-control.multi .selectize-input.has-items {
padding-left: 5px;
padding-right: 5px;
}
.selectize-control.multi .selectize-input.disabled [data-value] {
color: #999;
text-shadow: none;
background: none;
-webkit-box-shadow: none;
box-shadow: none;
}
.selectize-control.multi .selectize-input.disabled [data-value],
.selectize-control.multi .selectize-input.disabled [data-value] .remove {
border-color: #e6e6e6;
}
.selectize-control.multi .selectize-input.disabled [data-value] .remove {
background: none;
}
.selectize-control.multi .selectize-input [data-value] {
text-shadow: 0 1px 0 rgba(0, 51, 83, 0.3);
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
background-color: #1b9dec;
background-image: -moz-linear-gradient(top, #1da7ee, #178ee9);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#1da7ee), to(#178ee9));
background-image: -webkit-linear-gradient(top, #1da7ee, #178ee9);
background-image: -o-linear-gradient(top, #1da7ee, #178ee9);
background-image: linear-gradient(to bottom, #1da7ee, #178ee9);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1da7ee', endColorstr='#ff178ee9', GradientType=0);
-webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.2),inset 0 1px rgba(255,255,255,0.03);
box-shadow: 0 1px 0 rgba(0,0,0,0.2),inset 0 1px rgba(255,255,255,0.03);
}
.selectize-control.multi .selectize-input [data-value].active {
background-color: #0085d4;
background-image: -moz-linear-gradient(top, #008fd8, #0075cf);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#008fd8), to(#0075cf));
background-image: -webkit-linear-gradient(top, #008fd8, #0075cf);
background-image: -o-linear-gradient(top, #008fd8, #0075cf);
background-image: linear-gradient(to bottom, #008fd8, #0075cf);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff008fd8', endColorstr='#ff0075cf', GradientType=0);
}
.selectize-control.single .selectize-input {
-webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.8);
box-shadow: 0 1px 0 rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.8);
background-color: #f9f9f9;
background-image: -moz-linear-gradient(top, #fefefe, #f2f2f2);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fefefe), to(#f2f2f2));
background-image: -webkit-linear-gradient(top, #fefefe, #f2f2f2);
background-image: -o-linear-gradient(top, #fefefe, #f2f2f2);
background-image: linear-gradient(to bottom, #fefefe, #f2f2f2);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffefefe', endColorstr='#fff2f2f2', GradientType=0);
}
.selectize-control.single .selectize-input,
.selectize-dropdown.single {
border-color: #b8b8b8;
}
.selectize-dropdown .optgroup-header {
padding-top: 7px;
font-weight: bold;
font-size: 0.85em;
}
.selectize-dropdown .optgroup {
border-top: 1px solid #f0f0f0;
}
.selectize-dropdown .optgroup:first-child {
border-top: 0 none;
}

View file

@ -1,31 +0,0 @@
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>javascript</title></head><body>
<h3>javascript</h3>
<p><a href="../sitejs/index.html">javascript for domains</a></p>
<p><b>Global javascript</b> files locates in subfolder "js". Long press button [☰] to configure. Click the following links to install:<br>
<a target=_self" href="i:0hjs/savePassword.js:https://fastly.jsdelivr.net/gh/torappinfo/uwebzh/searchurl/txt/passwdsave.js">Save password</a><br>
<a target="_self" href="i:0hjs/instantPage.js:https://fastly.jsdelivr.net/npm/instant.page">Instant page</a></p>
<p><b>large size javascript code</b> can be installed to the folder &quot;bookmarklet&quot; (long pressing button "js" to popup menu):<br>
<a target="_self" href='i:0hbookmarklet/eruda.js:https://fastly.jsdelivr.net/npm/eruda:%0Aeruda.init()'>Eruda</a><br>
<a target="_self" href="i:0hbookmarklet/performance.js:https://fastly.jsdelivr.net/gh/micmro/performance-bookmarklet/dist/performanceBookmarklet.min.js">Performance</a><br>
</p>
<p><b>Remote javascript</b> is defined in default.rjs. Click the following link to install. (Force exit and re-launch the app</b>, then long press the button with icon "search" to popup the menu.)<br>
<a href="i:04Selection to sentence:;let g='sentence';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);">Selection to sentence:;let g='sentence';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);</a><br><br>
<a href="i:04Selection to line:;let g='line';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);">Selection to line:;let g='line';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);</a><br><br>
<a href="i:04Selection to paragraph:;let g='paragraph';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);">Selection to paragraph:;let g='paragraph';getSelection().modify('move','forward',g);getSelection().modify('extend','backward',g);</a><br><br>
<a href="i:04mathjax:['https://fastly.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js']">mathjax:['https://fastly.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js']</a><br><br>
<a href="i:04mdme:['https://fastly.jsdelivr.net/npm/mdme']">mdme:['https://fastly.jsdelivr.net/npm/mdme']</a><br><br>
<a href="i:04md+tex:['https://fastly.jsdelivr.net/npm/texme']">md+tex:['https://fastly.jsdelivr.net/npm/texme']</a><br><br>
<a href="i:04New tab to open links:;let d=document;b=d.createElement('base');b.setAttribute('target','_blank');d.head.appendChild(b)">New tab to open links:;let d=document;b=d.createElement('base');b.setAttribute('target','_blank');d.head.appendChild(b)</a><br><br>
<a href="i:04Site search:;open('i:15site:' + location.hostname)">Site search:;open('i:15site:' + location.hostname)</a><br><br>
<a href="i:04Spell check:;let t=document.getElementsByTagName('textarea');let v=t[0].spellcheck;if(v==null)v=false;t[0].spellcheck=!v">Spell check:;let t=document.getElementsByTagName('textarea');let v=t[0].spellcheck;if(v==null)v=false;t[0].spellcheck=!v</a><br><br>
</p>
<p>Remote script configuration file &quot;default.rjs&quot; whose lines have the following format:
[script name]:[javascript code to return url arrays]</p>
</body></html>

View file

@ -1,125 +0,0 @@
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>Search engines</title></head><body>
<h3>Search engines</h3>
<p>
Clicking the following links to install search engines to <a href="../index.html">uweb</a>'s home screen.</p>
Recommended engines (append any of following to file "home5.search")<br>
<p><a href="i:00Engines:i:40%s_00">Engines:i:40%s_00</a></p>
<p><a href="i:00bing image:http://bing.com/images/search?q=">bing image:http://bing.com/images/search?q=</a></p>
<p><a href="i:00wolfram:https://www.wolframalpha.com/input/?i=">wolfram:https://www.wolframalpha.com/input/?i=</a></p>
<p><a href="i:00wiki:https://en.wikipedia.org/wiki/Special:Search?search=">wiki:https://en.wikipedia.org/wiki/Special:Search?search=</a></p>
<p><a href="i:00Youtube:https://www.youtube.com/results?search_query=">Youtube:https://www.youtube.com/results?search_query=</a></p>
<p><a href="i:00Facebook:https://www.facebook.com/search/str/%s/keywords_search">Facebook:https://www.facebook.com/search/str/%s/keywords_search</a></p>
<p><a href="i:00Instagram:https://www.instagram.com/explore/tags/%s/">Instagram:https://www.instagram.com/explore/tags/%s/</a></p>
<p><a href="i:00boardreader:https://boardreader.com/s/%s.html">boardreader:https://boardreader.com/s/%s.html</a></p>
<p><a href="i:00book_google:https://whogles.herokuapp.com/search?q=%22parent+directory%22+pdf+OR+epub+OR+DjVU+OR+xps+%22%s%22+-html+-htm+-shtml+-phtml+-php+-buy+-aspx+-jsp+-asp+-cgi+-pdf+-ftp+-unknownsecret&num=100&filter=0">book_google:https://whogles.herokuapp.com/search?q=%22parent+directory%22+pdf+OR+epub+OR+DjVU+OR+xps+%22%s%22+-html+-htm+-shtml+-phtml+-php+-buy+-aspx+-jsp+-asp+-cgi+-pdf+-ftp+-unknownsecret&num=100&filter=0</a></p>
<p>Note: "Engines" needs file "engine.search"whose format is same as "home.search" except that the keyword part of url must be denoted with "%s". Pressing the right arrow button on the search result page will automatically query with next engine in the file.</p>
<p>Common engines:<br>
<p><a href="i:00google:https://google.com/search?q=">google:https://google.com/search?q=</a></p>
<p><a href="i:00bing:http://www.bing.com/search?q=">bing:http://www.bing.com/search?q=</a></p>
<p><a href="i:00neeva:https://neeva.com/search?q=">neeva:https://neeva.com/search?q=</a></p>
<p><a href="i:00you:https://you.com/search?q=">you:https://you.com/search?q=</a></p>
<p><a href="i:00seekr:https://www.seekr.com/search?query=">seekr:https://www.seekr.com/search?query=</a></p>
<p><a href="i:00xda:https://www.xda-developers.com/search/">xda:https://www.xda-developers.com/search/</a></p>
<p><a href="i:00Feeling lucky:https://google.com/search?btnl=1&q=">Feeling lucky:https://google.com/search?btnl=1&q=</a></p>
<p><a href="i:00pix:https://www.google.com/search?tbm=isch&q=">pix:https://www.google.com/search?tbm=isch&q=</a></p>
<p><a href="i:00youtube:https://youtube.com/results?search_query=">youtube:https://youtube.com/results?search_query=</a></p>
<p><a href="i:00news:https://news.search.yahoo.com/search/news?p=">news:https://news.search.yahoo.com/search/news?p=</a></p>
<p><a href="i:00stock:https://finance.yahoo.com/quote/">stock:https://finance.yahoo.com/quote/</a></p>
<p><a href="i:00amazon:https://www.amazon.com/s/?field-keywords=">amazon:https://www.amazon.com/s/?field-keywords=</a></p>
<p><a href="i:00weather:https://www.wunderground.com/cgi-bin/findweather/getForecast?query=">weather:https://www.wunderground.com/cgi-bin/findweather/getForecast?query=</a></p>
<p><a href="i:00IMDB:https://www.imdb.com/find?q=">IMDB:https://www.imdb.com/find?q=</a></p>
<p><a href="i:00film review:https://www.rottentomatoes.com/search/?search=">film review:https://www.rottentomatoes.com/search/?search=</a></p>
<p><a href="i:00goodreads:https://www.goodreads.com/search?query=">goodreads:https://www.goodreads.com/search?query=</a></p>
<p><a href="i:00audible:http://www.audible.com/search?sort=review-rank&advsearchKeywords=">audible:http://www.audible.com/search?sort=review-rank&advsearchKeywords=</a></p>
<p><a href="i:00audiobay:http://audiobookbay.nl/?s=">audiobay:http://audiobookbay.nl/?s=</a></p>
</p><p>
language:<br>
<p><a href="i:00OED:https://www.oed.com/LIBRARY?dest=https%3A%2F%2Fwww.oed.com%2Fsearch%3FsearchType%3Ddictionary%26q%3D%s%26_searchBtn%3DSearch&acc_id=65585&library_card=12363257">OED:https://www.oed.com/LIBRARY?dest=https%3A%2F%2Fwww.oed.com%2Fsearch%3FsearchType%3Ddictionary%26q%3D%s%26_searchBtn%3DSearch&acc_id=65585&library_card=12363257</a></p>
<p><a href="i:00webster1913:https://www.websters1913.com/words/">webster1913:https://www.websters1913.com/words/</a></p>
<p><a href="i:00merriam-webster:https://www.merriam-webster.com/dictionary/">merriam-webster:https://www.merriam-webster.com/dictionary/</a></p>
<p><a href="i:00dictionary:https://www.dictionary.com/browse/">dictionary:https://www.dictionary.com/browse/</a></p>
<p><a href="i:00freedictionary:https://www.thefreedictionary.com/">freedictionary:https://www.thefreedictionary.com/</a></p>
<p><a href="i:00wordreference:https://www.wordreference.com/definition/">wordreference:https://www.wordreference.com/definition/</a></p>
<p><a href="i:00vocabulary:https://www.vocabulary.com/dictionary/">vocabulary:https://www.vocabulary.com/dictionary/</a></p>
<p><a href="i:00etymology:https://www.etymonline.com/search?q=">etymology:https://www.etymonline.com/search?q=</a></p>
<p><a href="i:00powerthesaurus:https://www.powerthesaurus.org/%s/synonyms">powerthesaurus:https://www.powerthesaurus.org/%s/synonyms</a></p>
<p><a href="i:00macmillanthesaurus:https://www.macmillanthesaurus.com/search/?auto=complete&q=">macmillanthesaurus:https://www.macmillanthesaurus.com/search/?auto=complete&q=</a></p>
<p><a href="i:00lword:https://lword.top/word.html#">lword:https://lword.top/word.html#</a></p>
<p><a href="i:00ludwig:https://ludwig.guru/s/">ludwig:https://ludwig.guru/s/</a></p>
<p><a href="i:00webster:https://www.merriam-webster.com/dictionary/">webster:https://www.merriam-webster.com/dictionary/</a></p>
<p><a href="i:00googledict:http://googledictionary.freecollocation.com/meaning?word=">googledict:http://googledictionary.freecollocation.com/meaning?word=</a></p>
<p><a href="i:00freetts_ru:https://freetts.com/Home/PlayAudio?Language=ru-RU&Voice=ru-RU-Standard-A&id=undefined&type=0&TextMessage=">freetts_ru:https://freetts.com/Home/PlayAudio?Language=ru-RU&Voice=ru-RU-Standard-A&id=undefined&type=0&TextMessage=</a></p>
<p><a href="i:00freetts_ar:https://freetts.com/Home/PlayAudio?Language=ar-XA&Voice=ar-XA-Standard-A&id=undefined&type=0&TextMessage=">freetts_ar:https://freetts.com/Home/PlayAudio?Language=ar-XA&Voice=ar-XA-Standard-A&id=undefined&type=0&TextMessage=</a></p>
</p><p>
Science:<br>
<p><a href="i:00britannica:https://www.britannica.com/search?query=">britannica:https://www.britannica.com/search?query=</a></p>
<p><a href="i:00mathRef:https://reference.wolfram.com/search/?q=">mathRef:https://reference.wolfram.com/search/?q=</a></p>
<p><a href="i:00mathSE:https://math.stackexchange.com/search?q=">mathSE:https://math.stackexchange.com/search?q=</a></p>
<p><a href="i:00phySE:https://physics.stackexchange.com/search?q=">phySE:https://physics.stackexchange.com/search?q=</a></p>
<p><a href="i:00physicsForum:https://www.physicsforums.com/search/2195918/?q=">physicsForum:https://www.physicsforums.com/search/2195918/?q=</a></p>
<p><a href="i:00chemSE:https://chemistry.stackexchange.com/search?q=">chemSE:https://chemistry.stackexchange.com/search?q=</a></p>
<p><a href="i:00chem:https://www.ncbi.nlm.nih.gov/pccompound?term=">chem:https://www.ncbi.nlm.nih.gov/pccompound?term=</a></p>
<p><a href="i:00proofwiki:https://proofwiki.org/w/index.php?search=">proofwiki:https://proofwiki.org/w/index.php?search=</a></p>
<p><a href="i:00physics:http://www.physics.org/explore-results-all.asp?q=">physics:http://www.physics.org/explore-results-all.asp?q=</a></p>
<p><a href="i:00biology:https://www.biologyonline.com/dictionary/">biology:https://www.biologyonline.com/dictionary/</a></p>
<p><a href="i:00nist chem:https://webbook.nist.gov/cgi/cbook.cgi?Formula=">nist chem:https://webbook.nist.gov/cgi/cbook.cgi?Formula=</a></p>
<p><a href="i:00chemiday:https://chemiday.com/search/?lang=en&q=">chemiday:https://chemiday.com/search/?lang=en&q=</a></p>
<p><a href="i:00chem.libretexts:https://chem.libretexts.org/Special:Search?q=">chem.libretexts:https://chem.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00bio.libretexts:https://bio.libretexts.org/Special:Search?q=">bio.libretexts:https://bio.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00phys.libretexts:https://phys.libretexts.org/Special:Search?q=">phys.libretexts:https://phys.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00med.libretexts:https://med.libretexts.org/Special:Search?q=">med.libretexts:https://med.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00math.libretexts:https://math.libretexts.org/Special:Search?q=">math.libretexts:https://math.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00stats.libretexts:https://stats.libretexts.org/Special:Search?q=">stats.libretexts:https://stats.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00geo.libretexts:https://geo.libretexts.org/Special:Search?q=">geo.libretexts:https://geo.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00eng.libretexts:https://eng.libretexts.org/Special:Search?q=">eng.libretexts:https://eng.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00biz.libretexts:https://biz.libretexts.org/Special:Search?q=">biz.libretexts:https://biz.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00human.libretexts:https://human.libretexts.org/Special:Search?q=">human.libretexts:https://human.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00socialsci.libretexts:https://socialsci.libretexts.org/Special:Search?q=">socialsci.libretexts:https://socialsci.libretexts.org/Special:Search?q=</a></p>
<p><a href="i:00workforce.libretexts:https://workforce.libretexts.org/Special:Search?q=">workforce.libretexts:https://workforce.libretexts.org/Special:Search?q=</a></p>
</p><p>
Engines that can use as documentation:<br>
<p><a href="i:00oscobo:https://www.oscobo.com/search.php?q=">oscobo:https://www.oscobo.com/search.php?q=</a></p>
<p><a href="i:00teoma:https://www.teoma.com/web?q=">teoma:https://www.teoma.com/web?q=</a></p>
<p><a href="i:00lycos:https://search.lycos.com/web/?q=">lycos:https://search.lycos.com/web/?q=</a></p>
<p><a href="i:00technorati:http://technorati.com/search/index.php?q=">technorati:http://technorati.com/search/index.php?q=</a></p>
<p><a href="i:00qwant:https://lite.qwant.com/?q=">qwant:https://lite.qwant.com/?q=</a></p>
<p><a href="i:00swisscows:https://swisscows.com/web?query=">swisscows:https://swisscows.com/web?query=</a></p>
<p><a href="i:00duck:https://duckduckgo.com/?q=">duck:https://duckduckgo.com/?q=</a></p>
<p><a href="i:00mojeek:https://www.mojeek.com/search?q=">mojeek:https://www.mojeek.com/search?q=</a></p>
<p><a href="i:00gigablast:https://www.gigablast.com/search?c=main&qlangcountry=en-us&q=">gigablast:https://www.gigablast.com/search?c=main&qlangcountry=en-us&q=</a></p>
<p><a href="i:00yandex:https://yandex.com/search/?text=">yandex:https://yandex.com/search/?text=</a></p>
<p><a href="i:00searx:https://searchx.mobi/?q=">searx:https://searchx.mobi/?q=</a></p>
</p><p>
Cloud storage:<br>
</p><p>
Scholar:<br>
<p><a href="i:00sweetsearch:https://sweetsearch.com/search?q=">sweetsearch:https://sweetsearch.com/search?q=</a></p>
<p><a href="i:00refseek:https://www.refseek.com/search?q=">refseek:https://www.refseek.com/search?q=</a></p>
<p><a href="i:00google scholar:https://scholar.google.com/scholar?q=">google scholar:https://scholar.google.com/scholar?q=</a></p>
<p><a href="i:00semanticscholar:https://www.semanticscholar.org/search?sort=relevance&q=">semanticscholar:https://www.semanticscholar.org/search?sort=relevance&q=</a></p>
</p><p>
Developer:<br>
<p><a href="i:00git:https://github.com/search?type=Repositories&amp;q=">git:https://github.com/search?type=Repositories&amp;q=</a></p>
<p><a href="i:00man:http://man.cx/">man:http://man.cx/</a></p>
<p><a href="i:00code:http://searchcode.com/?q=">code:http://searchcode.com/?q=</a></p>
<p><a href="i:00symbolhound:http://symbolhound.com/?q=">symbolhound:http://symbolhound.com/?q=</a></p>
<p><a href="i:00vector:https://vector.me/search/">vector:https://vector.me/search/</a></p>
<p><a href="i:00jsdelivr:http://www.jsdelivr.com/?query=">jsdelivr:http://www.jsdelivr.com/?query=</a></p>
<p><a href="i:00greasyfork:https://greasyfork.org/en/scripts?sort=updated&q=">greasyfork:https://greasyfork.org/en/scripts?sort=updated&q=</a></p>
</p><p>
app:<br>
<p><a href="i:00App store:market://search?q=">App store:market://search?q=</a></p>
</p><p>
local engines(May need termux customized edition and tools like bcgnuplot etc.):<br>
<p><a href="i:00bc:d:text/html:echo \'%s\'|bc -l -q:">bc:d:text/html:echo \'%s\'|bc -l -q:</a></p>
<p><a href="i:002D plot:d:image/svg+xml:gnuplot -e \'set term svg;set output; plot %s\':">2D plot:d:image/svg+xml:gnuplot -e \'set term svg;set output; plot %s\':</a></p>
<p><a href="i:003D plot:d:image/svg+xml:gnuplot -e \'set term svg;set output; splot %s\':">3D plot:d:image/svg+xml:gnuplot -e \'set term svg;set output; splot %s\':</a></p>
</p>
</body></html>

View file

@ -0,0 +1,15 @@
{
const oFetch = window.fetch;
window.fetch = function(url,options){
if("https://www.bing.com/turing/conversation/create"==url){
url = "https://mybing2.xn--xyza.top/Create";
options = {
credentials: 'include',
headers:{},
};
}
return oFetch(url,options)
.then((res)=>{return res;})
.catch((err)=>{return err;});
}
}

View file

@ -0,0 +1,25 @@
%1%
%2%
%3%
%4%
%5%
%6%
%7%
%8%
<script charset="utf-8" src="https://codeberg.org/uweb/pages/raw/branch/master/en/searchurl/config.js#"></script>

View file

@ -0,0 +1,29 @@
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width" />
<title></title><script>
const url=`%2%`;
const name=`%1%`;
</script></head><body>
<script>
document.title = "webdav links for "+name;
var html =`
<p><b>Click to install the link menu items:</b></p>
<a href="i:0gdefault.link::Backup2%1%: {let path='%f';let iSlash=path.lastIndexOf('/',path.length-2);let f;if('/'!=path[path.length-1])f=path.substring(iSlash+1);else f=path.substring(iSlash+1,path.length-1);location.href='i:0e'+path+':%2%/'+f+'.tgz';}%0A">Backup to %1%</a><br>
<a href="i:0gdefault.link::restoreFrom%1%: {let path='%f';let iSlash=path.lastIndexOf('/',path.length-2);let f;if('/'!=path[path.length-1])f=path.substring(iSlash+1);else f=path.substring(iSlash+1,path.length-1);location.href='i:0d%2%/'+f+'.tgz';}%0A">Restore from %1%</a><br>
<a href="i:0gdefault.link::upload_%1%: {let path='%f';let iSlash=path.lastIndexOf('/',path.length-2);let f;if('/'!=path[path.length-1])f=path.substring(iSlash+1);else f=path.substring(iSlash+1,path.length-1)+'.tgz';location.href='i:0u'+path+':%2%/'+f;}%0A">upload to %1%</a><br>
<a href="i:0gdefault.link::delete_%1%: {let path='%f';let iSlash=path.lastIndexOf('/',path.length-2);let f;if('/'!=path[path.length-1])f=path.substring(iSlash+1);else f=path.substring(iSlash+1,path.length-1)+'.tgz';location.href='i:0wDELETE:%2%/'+f;}%0A">Delete on server %1%</a><br>
<a href="i:0gdefault.link::mkdir_%1%: {let path='%f';let iSlash=path.lastIndexOf('/',path.length-2);let f=path.substring(iSlash+1);location.href='i:0wMKCOL:%2%/'+f;}%0A">Make directory on server %1%</a><br>
<p><b>Bookmarks:</b></p>
<a href="i:0e/data/data/info.torapp.uweb/files:%2%/uweb.tgz">Backup config to %1%</a><br>
<a href="i:0d%2%/uweb.tgz">Restore config from %1%</a><br>
<a href='i:0wDELETE:%2%/'>Delete on server %1%</a><br>
<a href='i:0wMKCOL:%2%/'>Make directory on server %1%</a><br>
`;
html = html.replaceAll("%1%",name).replaceAll("%2%",url);
document.body.innerHTML = html;
</script>
</body></html>

View file

@ -0,0 +1,2 @@
open clipboard link:clip/uweb:/system/bin/toybox grep -m1 -Eo '(http|https)://[^ "'\'']+'
code editor:text/html:printf "<style>#div{position:fixed;top:2px}#editor{position: absolute;top:30;right:0;bottom:0;left:0;}#textarea{display:none}</style><script src='http://cdn.bootcss.com/ace/1.4.9/ace.js'></script><script src='http://cdn.bootcss.com/ace/1.4.9/ext-language_tools.js'></script><script src='https://fastly.jsdelivr.net/gh/torappinfo/uwebzh/searchurl/ace.js'></script><div id='div'><button onclick='onSave(\"%f\")'>Save</button> <a href=''>Run</a></div><pre id='editor'></pre><textarea id='textarea'>";cat "%f"|sed 's/&/&amp;/g'|sed 's/<\//\&lt;\//g';

View file

@ -0,0 +1,31 @@
<!DOCTYPE html><html>
<title>docx2html</title>
<head>
<script src="https://fastly.jsdelivr.net/npm/mammoth@1.4.8/mammoth.browser.min.js"></script>
</head>
<body>
<div>
<center>
<h2>select a docx to convert to html</h2>
<input type="file" onchange="convert(this)"/>
</center>
<div id="container"></div>
</div>
<script>
var container = document.querySelector("#container");
function convert(input){
var files = input.files||[];
if (!files.length) return;
var file = files[0];
var reader = new FileReader();
reader.onloadend = function(event) {
var arrayBuffer = reader.result;
mammoth.convertToHtml({arrayBuffer: arrayBuffer}).then(function (resultObject) {
container.innerHTML = resultObject.value
});
}
reader.readAsArrayBuffer(file);
}
</script>
</body>
</html>

View file

@ -0,0 +1,3 @@
Select All/^A:i:56
Undo/^Z:i:56
Redo/^Y:i:56

View file

@ -0,0 +1,17 @@
<script>
if(location.href.endsWith('/')){
window.onload=function (){
let as=document.getElementsByTagName('a');for(let i=as.length-1;i>=0;i--){let h=as[i].href;if(h.startsWith('file:')&&h.endsWith('.md'))as[i].onclick=function(){location.href=this.href+'.search';}}
}
}else{
function loadJS(u){
let d=document;
let e=d.createElement('script');e.src=u;
d.head.appendChild(e);
}
if(location.href.endsWith('.md.search')){
window.markdeepOptions = {onload};
loadJS("https://casual-effects.com/markdeep/latest/markdeep.min.js?");
}
}
</script>

View file

@ -0,0 +1,15 @@
<script src="https://remarkjs.com/downloads/remark-latest.min.js">
</script>
<script type="text/javascript">
window.onload=function(){
var slideshow = remark.create({
navigation: {
click: true,
},
});
}
</script>
<textarea id="source">
class: middle

27
en/searchurl/txt/web.js Normal file
View file

@ -0,0 +1,27 @@
let ess = {
"a":["http://www.amazon.com/s?url=search-alias%3Daps&field-keywords=",],
"ab":["http://audiobookbay.se/?s=",],
"b":["http://www.bing.com/search?q=",],
"bi":["http://bing.com/images/search?q=",],
"bv":["https://www.bing.com/videos/search?q=",],
"g":["https://google.com/search?q=",],
"gi":["http://www.google.com/images?as_q=",],
"gf":["https://google.com/search?q=intitle:index.of+%22parent+directory%22+",],
"sx":["https://searx.be/?q=",],
"w":["https://en.wikipedia.org/wiki/Special:Search?search=",],
"wf":["https://encyclopedia.thefreedictionary.com/",],
"yt":["https://www.youtube.com/results?search_query=",],
};
let url=arguments[1];
let iS1 = url.search(/ [^ ]/);
let iS2 = url.indexOf(' ',iS1+2);
let name = url.substring(iS1+1,iS2)
let keywords = url.substring(iS2+1);
let es = ess[name];
if(es){
let len = es.length;
for(let i=1;i<len;i++)
window.open(es[i]+keywords);
location.href=es[0]+keywords;
}

35
en/searchurl/txt/web.sh Executable file
View file

@ -0,0 +1,35 @@
#!/usr/bin/dash
#usage: g [engine] word1 word2 ...
default=''
g="https://www.google.com.hk/search?q="
yt="https://www.youtube.com/results?search_query="
m="http://www.merriam-webster.com/dictionary/"
w="http://en.wikipedia.org/wiki/"
wd="https://en.wiktionary.org/wiki/"
b="http://www.bing.com/search?intlF=1&q="
ks="http://www.iciba.com/"
en="http://www.enacademic.com/searchall.php?SWord="
gen="http://gen.lib.rus.ec/search.php?req="
abb="http://audiobookbay.li/?s="
bd="https://www.baidu.com/s?wd="
gb="https://www.gigablast.com/search?q="
yd="http://dict.youdao.com/search?q="
a="http://www.amazon.com/s?url=search-alias%3Daps&field-keywords="
bdic="http://cn.bing.com/dict/search?q="
be="http://www.britannica.com/search?query="
u="http://www.urbandictionary.com/define.php?term="
o="http://en.oxforddictionaries.com/definition/"
eval engine=\$${1:-default} #engine=$(eval echo \${$1})
shift #concate second argument to the last one with +
string=$1
shift
for a in "$@"
do
string+="+$a"
done
echo $engine$string

11
en/searchurl/txt/zim.html Normal file
View file

@ -0,0 +1,11 @@
<head>
<base href="https://pwa.kiwix.org/www/index.html">
<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="init" src="js/init.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="jquery" src="js/lib/jquery-3.2.1.slim.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="bootstrap" src="js/lib/bootstrap.min.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="../app" src="js/lib/../app.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="zimArchiveLoader" src="js/lib/zimArchiveLoader.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="uiUtil" src="js/lib/uiUtil.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="util" src="js/lib/util.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="utf8" src="js/lib/utf8.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="cache" src="js/lib/cache.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="images" src="js/lib/images.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="settingsStore" src="js/lib/settingsStore.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="transformStyles" src="js/lib/transformStyles.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="transformZimit" src="js/lib/transformZimit.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="kiwixServe" src="js/lib/kiwixServe.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="updater" src="js/lib/updater.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="zimArchive" src="js/lib/zimArchive.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="zimfile" src="js/lib/zimfile.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="zimDirEntry" src="js/lib/zimDirEntry.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="xzdec_wrapper" src="js/lib/xzdec_wrapper.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="zstddec_wrapper" src="js/lib/zstddec_wrapper.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="filecache" src="js/lib/filecache.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="xzdec-wasm" src="js/lib/xzdec-wasm.js"></script><script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="zstddec-wasm" src="js/lib/zstddec-wasm.js"></script>
</head>
<body>
<input style="display: block; font-size: 14px;" class="btn btn-primary btn-inline" value="Select folder with ZIM files" id="archiveFilesLegacy" multiple="" accept=".zim,.dat,.idx,.txt,.zimaa,.zimab,.zimac,.zimad,.zimae,.zimaf,.zimag,.zimah,.zimai,.zimaj,.zimak,.zimal,.zimam,.ziman,.zimao,.zimap,.zimaq,.zimar,.zimas,.zimat,.zimau,.zimav,.zimaw,.zimax,.zimay,.zimaz, .zimba, .zimbb, .zimbc, .zimbd, .zimbe, .zimbf, .zimbg, .zimbh, .zimbi, .zimbj, .zimbk, .zimbl, .zimbm, .zimbn, .zimbo, .zimbp, .zimbq, .zimbr, .zimbs, .zimbt, .zimbu, .zimbv, .zimbw, .zimbx, .zimby, .zimbz" type="file">
<script type="text/javascript" data-main="js/init.js" src="js/lib/require.js">
</script>
</body>

View file

@ -1,66 +0,0 @@
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>url services</title></head><body>
<h3>url services</h3>
<p>
Click the following links to install url services with <a href="..">uweb browser</a>. <b>Force exit and re-launch the app</b>, then long press the button with the icon "image" to popup the menu.<br>
<p><a href="i:01Fullscreen video:i:5f">Fullscreen video:i:5f</a></p>
<p><a href="i:01Send url:i:5j">Send url:i:5j</a></p>
<p><a href="i:01Send url(player):i:5ji:5g">Send url(player):i:5ji:5g</a></p>
<p><a href="i:01Send url(bookmark):i:5ji:52../home5:">Send url(bookmark):i:5ji:52../home5:</a></p>
<p><a href="i:01Send url(clipboard):i:5ji:5b">Send url(clipboard):i:5ji:5b</a></p>
<p><a href="i:01Send url(fullscreen):i:5ji:5f">Send url(fullscreen):i:5ji:5f</a></p>
<p><a href="i:01Send url(bookmark fullscreen):i:5ji:52../home5:i:5f">Send url(bookmark fullscreen):i:5ji:52../home5:i:5f</a></p>
<p><a href="i:01Send url(site fullscreen):i:5ji:0mi:5f:">Send url(site fullscreen):i:5ji:0mi:5f:</a></p>
<p><a href="i:01Send url(video):i:5ji:0mc16:">Send url(video):i:5ji:0mc16:</a></p>
<p><a href="i:01Send url(bookmark site fullscreen):i:5ji:52../home5:i:0mi:5f:">Send url(bookmark site fullscreen):i:5ji:52../home5:i:0mi:5f:</a></p>
<p><a href="i:01Redirect/edit:e:">Redirect/edit:e:</a></p>
<p><a href="i:01Save2autocomplete:i:51:">Save2autocomplete:i:51:</a></p>
<p><a href="i:01Bookmark:i:52:">Bookmark:i:52:</a></p>
<p><a href="i:01Note:i:53:">Note:i:53:</a></p>
<p><a href="i:01Save engine:i:54:">Save engine:i:54:</a></p>
<p><a href="i:01Save link:i:55:">Save link:i:55:</a></p>
<p><a href="i:01Save to desktop:i:58">Save to desktop:i:58</a></p>
<p><a href="i:01Add to media storage::001">Add to media storage::001</a></p>
<p><a href="i:01tgurl:https://tx.me/share/url?url=">tgurl:https://tx.me/share/url?url=</a></p>
<p><a href="i:01tgdownload:https://tx.me/share/url?url=/download ">tgdownload:https://tx.me/share/url?url=/download </a></p>
<p><a href="i:01Compatible mode:i:5d">Compatible mode:i:5d</a></p>
<p><a href="i:01papago:https://papago.naver.net/website?locale=en&target=en&url=">papago:https://papago.naver.net/website?locale=en&target=en&url=</a></p>
<p><a href="i:01google translate:https://translate.google.com/translate?sl=auto&tl=en&u=">google translate:https://translate.google.com/translate?sl=auto&tl=en&u=</a></p>
<p><a href="i:01Source:view-source:">Source:view-source:</a></p>
<p><a href="i:01outline:https://www.outline.com/">outline:https://www.outline.com/</a></p>
<p><a href="i:012pdf:https://www.web2pdfconvert.com#">2pdf:https://www.web2pdfconvert.com#</a></p>
<p><a href="i:01printfriendly:https://www.printfriendly.com/print/?url=">printfriendly:https://www.printfriendly.com/print/?url=</a></p>
<p><a href="i:01htmlview:https://htmlview.glitch.me/?">htmlview:https://htmlview.glitch.me/?</a></p>
<p><a href="i:01htmlpreview:https://htmlpreview.github.io/?">htmlpreview:https://htmlpreview.github.io/?</a></p>
<p><a href="i:01webarchive:https://web.archive.org/web/*/">webarchive:https://web.archive.org/web/*/</a></p>
<p><a href="i:01archive:https://archive.is/?run=1&url=">archive:https://archive.is/?run=1&url=</a></p>
<p><a href="i:01google by image:https://www.google.com/searchbyimage?image_url=">google by image:https://www.google.com/searchbyimage?image_url=</a></p>
<p><a href="i:01tinyeye:https://tineye.com/search?url=">tinyeye:https://tineye.com/search?url=</a></p>
<p><a href="i:01Yandex image:https://yandex.com/images/search?text=">Yandex image:https://yandex.com/images/search?text=</a></p>
<p><a href="i:01Yandex by image:https://yandex.com/images/search?family=yes&rpt=imageview&url=">Yandex by image:https://yandex.com/images/search?family=yes&rpt=imageview&url=</a></p>
<p><a href="i:01ascii2d:https://ascii2d.net/search/url/">ascii2d:https://ascii2d.net/search/url/</a></p>
<p><a href="i:01trace.moe:https://trace.moe/?url=">trace.moe:https://trace.moe/?url=</a></p>
<p><a href="i:01saucenao:https://saucenao.com/search.php?url=">saucenao:https://saucenao.com/search.php?url=</a></p>
<p><a href="i:01Add to Feedly:https://feedly.com/i/subscription/feed/">Add to Feedly:https://feedly.com/i/subscription/feed/</a></p>
<p><a href="i:01Video download:https://tbvd.herokuapp.com/redirect?url=">Video download:https://tbvd.herokuapp.com/redirect?url=</a></p>
<p><a href="i:01Audio download:https://tbvd.herokuapp.com/video?audio=on&url=">Audio download:https://tbvd.herokuapp.com/video?audio=on&url=</a></p>
<p><a href="i:01Site analyzer:https://www.similarweb.com/website/">Site analyzer:https://www.similarweb.com/website/</a></p>
<p><a href="i:01Site buildwith:https://builtwith.com/?">Site buildwith:https://builtwith.com/?</a></p>
<p><a href="i:01instapaper:https://www.instapaper.com/text?u=">instapaper:https://www.instapaper.com/text?u=</a></p>
<p><a href="i:01google docs:http://docs.google.com/gview?embedded=true&url=">google docs:http://docs.google.com/gview?embedded=true&url=</a></p>
</p><p>
The following needs corresponding <a href="../html5/index.html">html5 application</a> to be installed:<br>
<p><a href="i:01txtview:file:///data/data/info.torinfo.uweb/files/app/txtview.html?url=">txtview:file:///data/data/info.torinfo.uweb/files/app/txtview.html?url=</a></p>
<p><a href="i:01markdeep:file:///data/data/info.torinfo.uweb/files/app/markdeep.html?url=">markdeep:file:///data/data/info.torinfo.uweb/files/app/markdeep.html?url=</a></p>
<p><a href="i:01plyr:file:///data/data/info.torinfo.uweb/files/app/plyr.html?u=">plyr:file:///data/data/info.torinfo.uweb/files/app/plyr.html?u=</a></p>
<p><a href="i:01dplayer:file:///data/data/info.torinfo.uweb/files/app/dplayer.html?u=">dplayer:file:///data/data/info.torinfo.uweb/files/app/dplayer.html?u=</a></p>
<p><a href="i:01pdf:file:///data/data/info.torinfo.uweb/files/app/pdfviewer.html?file=">pdf:file:///data/data/info.torinfo.uweb/files/app/pdfviewer.html?file=</a></p>
<p><a href="i:01epub:file:///data/data/info.torinfo.uweb/files/app/epub.html?u=">epub:file:///data/data/info.torinfo.uweb/files/app/epub.html?u=</a></p>
<p><a href="i:01djvu:file:///data/data/info.torinfo.uweb/files/app/djvu.html?url=">djvu:file:///data/data/info.torinfo.uweb/files/app/djvu.html?url=</a></p>
</p><p>
</p>
<p>in which &quot;redirect&quot; needs <a href="../redirect/index.html">default.redirect</a>.</p>
</body></html>

View file

@ -0,0 +1,17 @@
export default async function httpHandler(req: Request): Response {
let url = req.url;
let iSlash = url.indexOf('/', 11);
let nUrl = url.substring(iSlash + 1);
return await goUrl(req, nUrl);
}
async function goUrl(request, url) {
const Url = new URL(url);
const newReq = new Request(Url, {
method: request.method,
headers: request.headers,
body: request.body,
redirect: 'follow'
});
return await fetch(newReq);
}

44
en/searchurl/webdav.html Normal file
View file

@ -0,0 +1,44 @@
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width" />
<script>function g(){
let d=document;
let f=d.forms[0];
let loc = window.location.href;
let dir = loc.substring(0, loc.lastIndexOf ("/")+1);
window.open("f:"+f.i.value+"&"+f.u.value+":"+dir+"template/webdav.html");
return false;
}
</script><style>
input{height:40px;width:100%;border-radius:50px;}
</style>
<title>webdav storage</title></head><body>
<p>This page is to generate install-able menu items and bookmarks for webdav cloud storage operations (upload, backup/restore, delete and create directory).</p>
Bookmark the generated page for later use.<br>
<form onsubmit="return g();" style="margin:5px 0 5px 0;padding:0px">
<input name=i placeholder="Name"/><br>
<input name=u placeholder="Server url including path"/><br>
<input type="submit" value="webdav links">
</form>
<p>
<a href="javascript:{let f=document.forms[0];f.i.value='Box';f.u.value='https://dav.box.com/dav';void(0)}">Box</a>
<a href="javascript:{let f=document.forms[0];f.i.value='koofr';f.u.value='https://app.koofr.net/dav/koofr';void(0)}">koofr</a>
<a href="javascript:{let f=document.forms[0];f.i.value='pcloud';f.u.value='https://webdav.pcloud.com';void(0)}">pcloud</a>
<a href="javascript:{let f=document.forms[0];f.i.value='powerfolder';f.u.value='https://my.powerfolder.com/webdav/personal';void(0)}">powerfolder</a>
<a href="javascript:{let f=document.forms[0];f.i.value='yandex';f.u.value='https://webdav.yandex.com';void(0)}">yandex</a>
<a href="javascript:{let f=document.forms[0];f.i.value='opendrive';f.u.value='https://webdav.opendrive.com';void(0)}">opendrive</a>
<a href="javascript:{let f=document.forms[0];f.i.value='sme';f.u.value='https://webdav.storagemadeeasy.com';void(0)}">storagemadeeasy</a>
<a href="javascript:{let f=document.forms[0];f.i.value='nut';f.u.value='https://dav.jianguoyun.com/dav/%e6%88%91%e7%9a%84%e5%9d%9a%e6%9e%9c%e4%ba%91';void(0)}">Nutstore</a>
<a href="javascript:{let f=document.forms[0];f.i.value='teracloud';f.u.value='https://yura.teracloud.jp/dav';void(0)}">teracloud</a>
</p>
</body></html>

View file

@ -3,10 +3,11 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/sitejs/" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Javascript and CSS for domains</title> <title>JS/CSS/HTML/preprocessing for domains</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +29,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a> <a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
@ -40,35 +41,71 @@
<br /> <br />
<div class="container"> <div class="container">
<h1 class="title">Javascript and CSS for domains <h1 class="title">JS/CSS/HTML/preprocessing for domains
<br> <br>
<span class="subtitle"></span> <span class="subtitle"></span>
</h1> </h1>
<ul class="tags"> <ul class="tags">
<li><a href="../tags/javascript">javascript</a> </li> <li><a href="../tags/javascript/index.html#">javascript</a> </li>
<li><a href="../tags/css">css</a> </li> <li><a href="../tags/css/index.html#">css</a> </li>
</ul> </ul>
<p>Javascript (load when page completes, earliest loaded JS should use sitecss).</p> <h3 id="javascript-load-when-page-completes-earliest-loaded-js-should-use-sitecss">Javascript (load when page completes, earliest loaded JS should use sitecss).</h3>
<ul> <ul>
<li>Need to be named as &quot;[domain root].js&quot;, such as &quot;yahoo.com.js&quot; or &quot;finance.yahoo.com.js&quot;. The script will be loaded on the whole domain tree sites. If several files matches the domain, then the script with longest file name is loaded.</li> <li>Need to be named as &quot;[domain root].js&quot;, such as &quot;yahoo.com.js&quot; or &quot;finance.yahoo.com.js&quot;. The script will be loaded on the whole domain tree sites. If several files matches the domain, then the script with longest file name is loaded.</li>
<li>Script must be put under the folder &quot;sitejs&quot; or &quot;/data/data/info.torapp.uweb/files/sitejs&quot;. The later folder has the priority.</li> <li>Script must be put under the folder &quot;sitejs&quot; or &quot;/data/data/info.torapp.uweb/files/sitejs&quot;. The later folder has the priority.</li>
<li>Long press the button &quot;settings&quot;, check the option &quot;Run user scripts&quot;.</li> <li>Long press the button &quot;settings&quot;, check the option &quot;Run user scripts&quot;.</li>
<li>Support 2/3-segment domains. If the length of the last 2-segments of domain is less than 7 (ex. &quot;com.pl&quot;), then it is treated as one segment.</li> <li>Support 2/3-segment domains. If the length of the last 2-segments of domain is less than 7 (ex. &quot;com.pl&quot;), then it is treated as one segment.</li>
</ul> </ul>
<p>CSS style and earliest loaded JS</p> <h3 id="css-style-and-earliest-loaded-js">CSS style and earliest loaded JS</h3>
<ul> <ul>
<li>Need to be named as &quot;[domain root].css&quot;, such as yahoo.com.css or finance.yahoo.com.css。</li> <li>Need to be named as &quot;[domain root].css&quot;, such as yahoo.com.css or finance.yahoo.com.css。</li>
<li>Under folder &quot;sitecss&quot;.</li> <li>Under folder &quot;sitecss&quot;.</li>
<li>&quot;[domain root].js&quot; is loaded at the earlieat time.</li> <li>&quot;[domain root].js&quot; is loaded at the earliest time.</li>
<li>Long press the button &quot;settings&quot;, check the option &quot;Apply user styles&quot;.</li> <li>Long press the button &quot;settings&quot;, check the option &quot;Apply user styles&quot;.</li>
</ul> </ul>
<p>If file &quot;default.css&quot; exists, the style will be applied to all sites without matching [domain root].css.</p> <p>If file &quot;default.css&quot; exists, the style will be applied to all sites not matching [domain root].css.</p>
<p>&quot;sitejs/.js&quot; , &quot;sitecss/.css&quot; and &quot;sitecss/.js&quot; are applied to all non-http urls (file urls etc.).</p> <h3 id="extra-html-and-preprocessing">Extra html and preprocessing</h3>
<ul>
<li>Need to be named as &quot;[domain].html&quot;. Notice: the file name stem here is &quot;[full domain]&quot; not &quot;[domain root]&quot;.</li>
<li>Under folder &quot;siteextra&quot;.</li>
<li>Long press the button &quot;settings&quot;, check the option &quot;Apply user extra&quot;.</li>
</ul>
<p>An open tag as the last tag in the last 50 bytes of the user extra html expects more content to follow, thus the extra html is placed before the site html. Ex. when the extra html ends with &quot;&lt;textarea&gt;&quot; or &quot;&lt;plaintext&gt;&quot;, the site source html appears as the value of the textarea/plaintext element, thus the extra html can further process the the site source html before rendering. A self closed tag such as &quot;&lt;br&gt;&quot; acts like open tags, also makes the site source follow the extra html.</p>
<p>&quot;sitejs/.js&quot;, &quot;sitecss/.css&quot;, &quot;sitecss/.js&quot; and &quot;siteextra/.html&quot; are applied to all non-http urls (file urls etc.).</p>
</div> </div>
<p>Last Modified: 2 April 2024<br>
support .js files under &#39;css&#39; folder<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

View file

@ -2,306 +2,598 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml"> xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url> <url>
<loc>/en/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/_posts/</loc>
<lastmod>2022-07-02T00:00:00+00:00</lastmod> <lastmod>2026-01-06T19:39:18+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/" href="https://jamesfengcao.gitlab.io/uweb/zh/_posts/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/" href="https://jamesfengcao.gitlab.io/uweb/en/_posts/"
/> />
</url><url> </url><url>
<loc>/en/_posts/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/html5/</loc>
<lastmod>2022-07-02T00:00:00+00:00</lastmod> <lastmod>2026-01-06T19:39:18+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/_posts/" href="https://jamesfengcao.gitlab.io/uweb/zh/html5/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/_posts/" href="https://jamesfengcao.gitlab.io/uweb/en/html5/"
/> />
</url><url> </url><url>
<loc>/en/sitemap/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/</loc>
<lastmod>2022-07-02T00:00:00+00:00</lastmod> <lastmod>2026-01-06T19:39:18+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/sitemap/" href="https://jamesfengcao.gitlab.io/uweb/zh/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/sitemap/" href="https://jamesfengcao.gitlab.io/uweb/en/"
/> />
</url><url> </url><url>
<loc>/en/filenames/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/topposts/</loc>
<lastmod>2022-06-30T00:00:00+00:00</lastmod> <lastmod>2026-01-06T18:58:25+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/filenames/" href="https://jamesfengcao.gitlab.io/uweb/zh/topposts/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/filenames/" href="https://jamesfengcao.gitlab.io/uweb/en/topposts/"
/> />
</url><url> </url><url>
<loc>/en/links/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/urls/</loc>
<lastmod>2022-06-30T00:00:00+00:00</lastmod> <lastmod>2025-12-31T21:21:32+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/links/" href="https://jamesfengcao.gitlab.io/uweb/zh/urls/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/links/" href="https://jamesfengcao.gitlab.io/uweb/en/urls/"
/> />
</url><url> </url><url>
<loc>/en/adblock/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/filemanager/</loc>
<lastmod>2022-06-25T00:00:00+00:00</lastmod> <lastmod>2025-12-05T21:06:12+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/adblock/" href="https://jamesfengcao.gitlab.io/uweb/zh/filemanager/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/adblock/" href="https://jamesfengcao.gitlab.io/uweb/en/filemanager/"
/> />
</url><url> </url><url>
<loc>/en/bookmarklet/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/tips/</loc>
<lastmod>2022-06-24T00:00:00+00:00</lastmod> <lastmod>2025-12-05T21:09:32+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/bookmarklet/" href="https://jamesfengcao.gitlab.io/uweb/zh/tips/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/bookmarklet/" href="https://jamesfengcao.gitlab.io/uweb/en/tips/"
/> />
</url><url> </url><url>
<loc>/en/tags/javascript/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/input/</loc>
<lastmod>2022-06-24T00:00:00+00:00</lastmod> <lastmod>2025-11-13T18:49:05+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/tags/javascript/" href="https://jamesfengcao.gitlab.io/uweb/zh/input/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/tags/javascript/" href="https://jamesfengcao.gitlab.io/uweb/en/input/"
/> />
</url><url> </url><url>
<loc>/en/tags/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/longclick/</loc>
<lastmod>2022-06-24T00:00:00+00:00</lastmod> <lastmod>2025-10-13T20:43:24+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/tags/" href="https://jamesfengcao.gitlab.io/uweb/zh/longclick/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/tags/" href="https://jamesfengcao.gitlab.io/uweb/en/longclick/"
/> />
</url><url> </url><url>
<loc>/en/tags/clipboard/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/tags/javascript/</loc>
<lastmod>2022-04-23T00:00:00+00:00</lastmod> <lastmod>2025-10-13T20:43:24+08:00</lastmod>
</url><url>
<loc>/en/tags/pc/</loc>
<lastmod>2022-04-23T00:00:00+00:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/tags/pc/" href="https://jamesfengcao.gitlab.io/uweb/zh/tags/javascript/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/tags/pc/" href="https://jamesfengcao.gitlab.io/uweb/en/tags/javascript/"
/> />
</url><url> </url><url>
<loc>/en/tags/ssh/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/tags/</loc>
<lastmod>2022-04-23T00:00:00+00:00</lastmod> <lastmod>2025-12-08T08:53:33+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/tags/ssh/" href="https://jamesfengcao.gitlab.io/uweb/zh/tags/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/tags/ssh/" href="https://jamesfengcao.gitlab.io/uweb/en/tags/"
/> />
</url><url> </url><url>
<loc>/en/tags/termux/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/search/</loc>
<lastmod>2022-04-23T00:00:00+00:00</lastmod> <lastmod>2025-12-05T07:43:12+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/tags/termux/" href="https://jamesfengcao.gitlab.io/uweb/zh/search/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/tags/termux/" href="https://jamesfengcao.gitlab.io/uweb/en/search/"
/> />
</url><url> </url><url>
<loc>/en/pccopy/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/globalcss/</loc>
<lastmod>2022-04-23T00:00:00+00:00</lastmod> <lastmod>2024-10-13T16:43:18+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/pccopy/" href="https://jamesfengcao.gitlab.io/uweb/zh/globalcss/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/pccopy/" href="https://jamesfengcao.gitlab.io/uweb/en/globalcss/"
/> />
</url><url> </url><url>
<loc>/en/tags/windows/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/ebrowser/</loc>
<lastmod>2022-04-23T00:00:00+00:00</lastmod> <lastmod>2024-07-12T10:48:12+08:00</lastmod>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/ebrowser/eb_select/</loc>
<lastmod>2024-07-12T10:48:12+08:00</lastmod>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/tags/clipboard/</loc>
<lastmod>2025-12-08T08:53:33+08:00</lastmod>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/tags/ssh/</loc>
<lastmod>2025-12-08T08:53:33+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/tags/windows/" href="https://jamesfengcao.gitlab.io/uweb/zh/tags/ssh/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/tags/windows/" href="https://jamesfengcao.gitlab.io/uweb/en/tags/ssh/"
/> />
</url><url> </url><url>
<loc>/en/globalcss/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/tags/termux/</loc>
<lastmod>2022-04-03T00:00:00+00:00</lastmod> <lastmod>2025-12-08T08:53:33+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/globalcss/" href="https://jamesfengcao.gitlab.io/uweb/zh/tags/termux/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/globalcss/" href="https://jamesfengcao.gitlab.io/uweb/en/tags/termux/"
/> />
</url><url> </url><url>
<loc>/en/icons/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/textprocess/</loc>
<lastmod>2022-02-06T00:00:00+00:00</lastmod> <lastmod>2025-12-08T08:53:33+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/icons/" href="https://jamesfengcao.gitlab.io/uweb/zh/textprocess/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/icons/" href="https://jamesfengcao.gitlab.io/uweb/en/textprocess/"
/> />
</url><url> </url><url>
<loc>/en/longclick/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/tags/windows/</loc>
<lastmod>2020-11-06T00:00:00+00:00</lastmod> <lastmod>2025-12-08T08:53:33+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/longclick/" href="https://jamesfengcao.gitlab.io/uweb/zh/tags/windows/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/longclick/" href="https://jamesfengcao.gitlab.io/uweb/en/tags/windows/"
/> />
</url><url> </url><url>
<loc>/en/tags/curl/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/links/</loc>
<lastmod>2020-08-24T00:00:00+00:00</lastmod> <lastmod>2025-12-08T08:49:39+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/tags/curl/" href="https://jamesfengcao.gitlab.io/uweb/zh/links/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/tags/curl/" href="https://jamesfengcao.gitlab.io/uweb/en/links/"
/> />
</url><url> </url><url>
<loc>/en/filecap/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/tcron/</loc>
<lastmod>2020-08-24T00:00:00+00:00</lastmod> <lastmod>2025-10-13T20:46:01+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/filecap/" href="https://jamesfengcao.gitlab.io/uweb/zh/tcron/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/filecap/" href="https://jamesfengcao.gitlab.io/uweb/en/tcron/"
/> />
</url><url> </url><url>
<loc>/en/tags/adblock/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/offlinecache/</loc>
</url><url> <lastmod>2024-04-08T18:19:08+08:00</lastmod>
<loc>/en/adblock_domain/</loc>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/adblock_domain/" href="https://jamesfengcao.gitlab.io/uweb/zh/offlinecache/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/adblock_domain/" href="https://jamesfengcao.gitlab.io/uweb/en/offlinecache/"
/> />
</url><url> </url><url>
<loc>/en/categories/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/tags/redirection/</loc>
<lastmod>2025-04-09T00:50:05+08:00</lastmod>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/redirect/</loc>
<lastmod>2025-04-09T00:50:05+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/categories/" href="https://jamesfengcao.gitlab.io/uweb/zh/redirect/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/categories/" href="https://jamesfengcao.gitlab.io/uweb/en/redirect/"
/> />
</url><url> </url><url>
<loc>/en/changelog/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/tags/adblock/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
</url><url> </url><url>
<loc>/en/tags/css/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/adblock_domain/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/tags/css/" href="https://jamesfengcao.gitlab.io/uweb/zh/adblock_domain/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/tags/css/" href="https://jamesfengcao.gitlab.io/uweb/en/adblock_domain/"
/> />
</url><url> </url><url>
<loc>/en/sitejs/</loc> <loc>https://jamesfengcao.gitlab.io/uweb/en/tags/css/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="zh" hreflang="zh"
href="/zh/sitejs/" href="https://jamesfengcao.gitlab.io/uweb/zh/tags/css/"
/> />
<xhtml:link <xhtml:link
rel="alternate" rel="alternate"
hreflang="en" hreflang="en"
href="/en/sitejs/" href="https://jamesfengcao.gitlab.io/uweb/en/tags/css/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/sitejs/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/sitejs/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/sitejs/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/bookmark/</loc>
<lastmod>2025-01-26T11:19:15+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/bookmark/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/bookmark/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/acmd/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/url2site/</loc>
<lastmod>2024-04-07T19:01:03+08:00</lastmod>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/changelog/</loc>
<lastmod>2026-01-06T18:58:25+08:00</lastmod>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/sitemap/</loc>
<lastmod>2025-04-09T00:47:06+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/sitemap/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/sitemap/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/filenames/</loc>
<lastmod>2025-04-09T00:46:07+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/filenames/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/filenames/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/adblock/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/adblock/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/adblock/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/bookmarklet/</loc>
<lastmod>2024-06-11T08:12:27+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/bookmarklet/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/bookmarklet/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/cmds/</loc>
<lastmod>2025-03-30T10:33:26+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/cmds/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/cmds/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/rjs/</loc>
<lastmod>2025-02-13T09:28:38+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/rjs/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/rjs/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/icons/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/icons/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/icons/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/searchcat/</loc>
<lastmod>2025-04-09T00:54:18+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/searchcat/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/searchcat/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/tags/search-engine/</loc>
<lastmod>2025-04-09T00:54:18+08:00</lastmod>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/termux/</loc>
<lastmod>2025-03-30T20:03:04+08:00</lastmod>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/useragents/</loc>
<lastmod>2024-07-10T11:21:12+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/useragents/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/useragents/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/tags/tdict/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/tags/tdict/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/tags/tdict/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/tools/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/tools/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/tools/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/tags/tools/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/tags/tools/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/tags/tools/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/tags/curl/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/tags/curl/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/tags/curl/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/filecap/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/filecap/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/filecap/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/gesture/</loc>
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/gesture/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/gesture/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/ebrowserreadme/</loc>
<lastmod>2025-12-08T08:44:26+08:00</lastmod>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/mirrors/</loc>
<lastmod>2025-11-12T18:13:17+08:00</lastmod>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/readme/</loc>
<lastmod>2025-11-12T14:19:06+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/readme/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/readme/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/categories/</loc>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/categories/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/categories/"
/>
</url><url>
<loc>https://jamesfengcao.gitlab.io/uweb/en/unlist/</loc>
<lastmod>2025-12-08T08:44:26+08:00</lastmod>
<xhtml:link
rel="alternate"
hreflang="zh"
href="https://jamesfengcao.gitlab.io/uweb/zh/unlist/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="https://jamesfengcao.gitlab.io/uweb/en/unlist/"
/> />
</url> </url>
</urlset> </urlset>

View file

@ -3,10 +3,11 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/sitemap/" />
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>Site map</title> <title>Configuration</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +29,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a> <a class="logo" href="javascript:void(0)" onclick="return nav2Lang('zh')">简体中文</a>
@ -40,80 +41,94 @@
<br /> <br />
<div class="container"> <div class="container">
<h1 class="title">Site map <h1 class="title">Configuration
<br> <br>
<span class="subtitle"></span> <span class="subtitle"></span>
</h1> </h1>
<ul class="tags"> <ul class="tags">
</ul> </ul>
<h4 id="ui">UI</h4> <p><a href="../mirrors/index.html#">Mirrors</a><br>
<a href="i:61ver:../../latest.html#">Check for updates</a></p>
<h4 id="ui">UI</h4>
<ul> <ul>
<li><a href="../searchurl/search.html">Search engines</a></li> <li><a href="../search/index.html#">Search engines</a></li>
<li><a href="../searchurl/homescreen.html">Home screen</a> <li><a href="../searchurl/homescreen.html#">Home screens</a></li>
<ul> <li><a href="i:61:../searchurl/func.html">UI</a> (<a href="i:61:https://gitee.com/jamesfengcao/uweb/raw/master/en/searchurl/func.html">gitee</a>)</li>
<li><a href="../searchurl/quickstart.html">Quick start</a></li> <li><a href="../searchurl/webdav.html#">webdav install-able menu generator</a></li>
</ul>
</li>
<li><a href="i:61:https://fastly.jsdelivr.net/gh/torappinfo/uwebzh/en/searchurl/func.html">UI</a> (<a href="i:61:https://gitee.com/jamesfengcao/uwebzh/raw/master/en/searchurl/func.html">gitee</a>)</li>
<li><a href="../searchurl/backup.html">Backup and restore</a></li>
</ul> </ul>
<h4 id="customization">Customization</h4> <h4 id="customization">Customization</h4>
<ul> <ul>
<li>Bottom toolbar button long pressing menus <li>Long pressing menus for toolbar buttons</li>
<ul> <li>User agents: default.uas</li>
<li><a href="../searchurl/uas.html">User agents</a></li> <li><a href="../rjs/index.html#">Javascript</a></li>
<li><a href="../searchurl/rjs.html">Javascript</a></li> <li><a href="../urls/index.html#">Url services</a></li>
<li><a href="../searchurl/urls.html">Url services</a></li> <li><a href="../links/index.html#">Links</a></li>
<li><a href="../links/index.html">Links</a></li> <li><a href="../cmds/index.html#">Commands</a></li>
<li><a href="../searchurl/cmds.html">Commands</a></li> <li><a href="../rjs/index.html#">Remote javascript</a></li>
<li><a href="../searchurl/rjs.html">Remote javascript</a></li> <li><a href="../textprocess/index.html#">Menu for selections</a></li>
<li><a href="../searchurl/pccopy/index.html">Menu for selections</a></li> <li><a href="../longclick/index.html#">Menu for long pressing hypertext</a></li>
</ul> <li><a href="../icons/index.html#">Toolbar</a></li>
</li> <li><a href="../gesture/index.html#">Gestures</a></li>
<li><a href="../longclick/index.html">Menu for long pressing hypertext</a></li> <li><a href="../acmd/index.html#">Address bar command modes</a></li>
<li><a href="../icons/index.html">Toolbar</a></li> <li><a href="i:60config.html:../searchurl/config.html">Advanced</a></li>
<li><a href="../gesture/index.html">Gestures</a></li>
<li><a href="i:60config.html:https://jamesfengcao.gitee.io/uwebzh/en/searchurl/config.html">Font settings</a></li>
</ul> </ul>
<h4 id="advanced">Advanced</h4> <h4 id="advanced">Advanced</h4>
<h5 id="content">Content</h5> <h5 id="content">Content</h5>
<ul> <ul>
<li><a href="../adblock/index.html">AD blocking</a></li> <li><a href="../adblock/index.html#">AD blocking</a></li>
<li><a href="../globalcss/index.html">CSS styles</a></li> <li><a href="../globalcss/index.html#">CSS styles</a></li>
<li><a href="../redirect/index.html">redirection</a></li> <li><a href="../redirect/index.html#">Redirection</a></li>
<li><a href="../sitejs/index.html">Javascript and CSS for domains</a></li> <li><a href="../offlinecache/index.html#">Offline cache</a></li>
<li><a href="../offlinecache/index.html">Offline cache</a></li> <li><a href="../sitejs/index.html#">JS/CSS/HTML/preprocessing for domains</a></li>
<li><a href="../url2site/index.html#">Any urls as website</a></li>
</ul> </ul>
<h5 id="tools">Tools</h5> <h5 id="tools">Tools</h5>
<ul> <ul>
<li><a href="../bookmarklet/index.html">Bookmarklets</a></li> <li><a href="../bookmarklet/index.html#">Bookmarklets</a></li>
<li><a href="../filecap/index.html">Custom file handling</a></li> <li><a href="../tcron/index.html#">Cron &amp; more</a></li>
<li><a href="../html5/index.html">Html5 application</a></li> <li><a href="../filecap/index.html#">Custom file handling</a></li>
<li><a href="../filemanager/index.html">File manager</a></li> <li><a href="../html5/index.html#">Html5 application</a></li>
<li><a href="../tools/index.html">Tools</a></li> <li><a href="../termux/index.html#">Termux</a></li>
<li>Termux
<ul>
<li><a href="../bc/index.html">GNU bc</a></li>
<li><a href="../gnuplot/index.html">Gnuplot</a></li>
<li><a href="../tcron/index.html">tcron</a></li>
<li><a href="../loadbt/index.html">Offline download</a></li>
</ul> </ul>
</li> <h5 id="info">Info</h5>
</ul>
<h5 id="miscellaneous">Miscellaneous</h5>
<ul> <ul>
<li><a href="../filenames/index.html">Configuration files</a></li> <li><a href="../../assets/help_en.html#">Manual</a></li>
<li><a href="../searchurl/plugins.html">Plugins</a></li> <li><a href="../tips/index.html#">Tips</a></li>
</ul> <li><a href="../filenames/index.html#">Configuration files</a></li>
<h4 id="tips">Tips</h4> <li><a href="../bookmark/index.html#">Bookmarks</a></li>
<ul>
<li><a href="../tips/index.html">Tips</a></li>
<li><a href="../video/index.html">Video</a></li>
<li><a href="../logcat/index.html">Debug</a></li>
</ul> </ul>
</div> </div>
<p>Last Modified: 9 April 2025<br>
fix broken links<br>
<pre></pre>
</p>
<script id='jsgiscus'
src='https://giscus.app/client.js'
data-repo="torappinfo/uweb"
data-repo-id="MDEwOlJlcG9zaXRvcnkzMDIyMDU3MjE="
data-category="Announcements"
data-category-id="DIC_kwDOEgNLGc4CQjsh"
data-mapping="title"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="light"
data-lang="en"
data-loading="lazy"
crossorigin="anonymous" async>
</script>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

View file

@ -3,10 +3,12 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/tags/adblock/" />
<link rel="alternate" type="application/rss+xml" href="https://jamesfengcao.gitlab.io/uweb/en/tags/adblock/index.xml" title="uweb browser: unlimited power">
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>adblock</title> <title>Adblock</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +30,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<nav> <nav>
</nav> </nav>
@ -36,12 +38,12 @@
<br /> <br />
<div class="container"> <div class="container">
<h1 class="title">adblock</h1> <h1 class="title">Adblock</h1>
<ul class="posts"> <ul class="posts">
<li class="post"> <li class="post">
<a href="../../adblock_domain"> <a href="../../adblock_domain/index.html#">
<span>Blocking domain trees</span> <span>Hosts files</span>
</a> </a>
</li> </li>
@ -49,5 +51,13 @@
<ul> <ul>
</div> </div>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

View file

@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel> <channel>
<title>adblock on </title> <title>Adblock on uweb browser: unlimited power</title>
<link>/en/tags/adblock/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/tags/adblock/</link>
<description>Recent content in adblock on </description> <description>Recent content in Adblock on uweb browser: unlimited power</description>
<generator>Hugo -- gohugo.io</generator><atom:link href="/en/tags/adblock/index.xml" rel="self" type="application/rss+xml" /> <generator>Hugo</generator>
<language>en</language>
<lastBuildDate>Tue, 02 Apr 2024 11:45:19 +0800</lastBuildDate>
<atom:link href="https://jamesfengcao.gitlab.io/uweb/en/tags/adblock/index.xml" rel="self" type="application/rss+xml" />
<item> <item>
<title>Blocking domain trees</title> <title>Hosts files</title>
<link>/en/adblock_domain/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/adblock_domain/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate> <pubDate>Mon, 20 Mar 2023 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/adblock_domain/</guid>
<guid>/en/adblock_domain/</guid> <description>&lt;p&gt;The enhanced hosts files &amp;quot;hosts&amp;quot; and &amp;quot;default.hosts&amp;quot; take effect with the setting option &amp;quot;use hosts&amp;quot;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;hosts&#34;&gt;hosts&lt;/h4&gt;&#xA;&lt;p&gt;The &lt;span style=&#34;color:red&#34;&gt;enhanced&lt;/span&gt; file &lt;a href=&#34;file:///data/data/info.torapp.uweb/files/hosts&#34;&gt;&amp;quot;hosts&amp;quot;&lt;/a&gt; defines IP addresses/attributes for domains. Each line has the following format:&lt;br&gt;&#xA;[[IP address][attributes]][single space][domain name]&lt;/p&gt;&#xA;&lt;p&gt;where &amp;quot;[[IP address][attributes]]&amp;quot; could be:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ipv4 address such as:&lt;br&gt;&#xA;172.67.157.211 torapp.eu.org&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ipv6 address, Ex.:&lt;br&gt;&#xA;[2606:4700:3037::6815:8c3] torapp.eu.org&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;empty, that would lift all server-imposed limitations. Ex.:&lt;br&gt;&#xA;[single space]gitee.com&lt;/p&gt;&#xA;&lt;p&gt;which will make all git repositories on the domain visitable as websites with raw file access url.&lt;/p&gt;</description>
<description>hosts blocks whole domain trees including all descedant domains. The domains in the hosts file must be 2 or 3 segment domains, such as &amp;quot;yahoo.com&amp;quot; and &amp;quot;finance.yahoo.com&amp;quot;. If the length of the last 2 segments is less than 7, such as &amp;quot;com.pl&amp;quot;, then it is treated as one segment, so domains like &amp;quot;xxx.xxx.com.pl&amp;quot; are also valid in the hosts file.
Each line of the hosts file has the following format:</description>
</item> </item>
</channel> </channel>
</rss> </rss>

View file

@ -3,10 +3,12 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="canonical" href="https://jamesfengcao.gitlab.io/uweb/en/tags/clipboard/" />
<link rel="alternate" type="application/rss+xml" href="https://jamesfengcao.gitlab.io/uweb/en/tags/clipboard/index.xml" title="uweb browser: unlimited power">
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" /> <link rel="stylesheet" href="../style.css#" type="text/css" />
<title>clipboard</title> <title>Clipboard</title>
<script type="text/javascript"> <script>
function findLang(){ function findLang(){
let href = location.href; let href = location.href;
for(let i=href.length-1;i>0;i--){ for(let i=href.length-1;i>0;i--){
@ -28,7 +30,7 @@
</head> </head>
<body> <body>
<header class='header'> <header class='header'>
<a class="logo" href="javascript:void(0)" onclick="return nav2('index.html')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html')">Tags</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
<nav> <nav>
</nav> </nav>
@ -36,12 +38,12 @@
<br /> <br />
<div class="container"> <div class="container">
<h1 class="title">clipboard</h1> <h1 class="title">Clipboard</h1>
<ul class="posts"> <ul class="posts">
<li class="post"> <li class="post">
<a href="../../pccopy"> <a href="../../textprocess/index.html#">
<span>Text selection</span> <span>Text selection/processing</span>
</a> </a>
</li> </li>
@ -49,5 +51,13 @@
<ul> <ul>
</div> </div>
<footer class="site-footer">
<div class="container">
&copy; 2018-2026 Richard H. Cao
</div>
</footer>
<!-- This document is licensed under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available at <https://www.gnu.org/licenses/>. -->
</body> </body>
</html> </html>

View file

@ -1,28 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel> <channel>
<title>clipboard on </title> <title>Clipboard on uweb browser: unlimited power</title>
<link>/en/tags/clipboard/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/tags/clipboard/</link>
<description>Recent content in clipboard on </description> <description>Recent content in Clipboard on uweb browser: unlimited power</description>
<generator>Hugo -- gohugo.io</generator> <generator>Hugo</generator>
<lastBuildDate>Sat, 23 Apr 2022 00:00:00 +0000</lastBuildDate><atom:link href="/en/tags/clipboard/index.xml" rel="self" type="application/rss+xml" /> <language>en</language>
<lastBuildDate>Mon, 08 Dec 2025 08:53:33 +0800</lastBuildDate>
<atom:link href="https://jamesfengcao.gitlab.io/uweb/en/tags/clipboard/index.xml" rel="self" type="application/rss+xml" />
<item> <item>
<title>Text selection</title> <title>Text selection/processing</title>
<link>/en/pccopy/</link> <link>https://jamesfengcao.gitlab.io/uweb/en/textprocess/</link>
<pubDate>Sat, 23 Apr 2022 00:00:00 +0000</pubDate> <pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
<guid>https://jamesfengcao.gitlab.io/uweb/en/textprocess/</guid>
<guid>/en/pccopy/</guid> <description>&lt;p&gt;Click the following links to install menus for long pressing the button &lt;code&gt;link&lt;/code&gt;:&lt;br&gt;&#xA;&lt;a href=&#34;i:0gdefault.select::Share:/uwebS:%0A&#34;&gt;Share&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::Edit:/text/html:echo -n %22%3cmeta charset=utf-8%3e%3cbody contenteditable%3e%22;cat%0A&#34;&gt;Edit&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::AddrBar:/uwebAddr:%0A&#34;&gt;Copy text to address bar&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::notems:/uwebA:printf i:0/js/hash2textarea.js:https://note.ms/ric#;cat%0A&#34;&gt;note.ms: cloud text sharing, please replace &amp;quot;ric&amp;quot; with your favorite ID&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::copyHtml:html/clip:%0A&#34;&gt;Copy selected text with html format to clipboard&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::Home:/uweb:printf file://data/data/info.torapp.uweb/files/home5.search%5C location.href=%5C%22i:15;cat;printf %5C%22%0A&#34;&gt;Search with home screen&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::google Translate:/uweb:printf &#39;https://translate.google.com/?sl=auto&amp;tl=en&amp;op=translate&amp;text=&#39;;cat|tr &#39; &#39; &#39;%2B&#39;%0A&#34;&gt;google Translate&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::bing Translate:/uweb:printf &#39;https://cn.bing.com/translator/?from=&amp;to=en&amp;text=&#39;;cat|tr &#39; &#39; &#39;%2B&#39;%0A&#34;&gt;bing translate&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;i:0gdefault.select::deepL:/uweb:printf https://www.deepl.com/translator-mobile#auto/en/;cat|sed &#39;s/ /%2520/g&#39;%0A&#34;&gt;deepL&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The file &lt;code&gt;default.select&lt;/code&gt; defines text processing menus for selected text. If no text is selected, the menu item operates on the whole page. Each line of the file has the following format:&lt;br&gt;&#xA;[Name]:[mimetype]:[command line]&lt;/p&gt;</description>
<description>Click the following links to install menus for long pressing the button &amp;quot;link&amp;quot;:
google Translate
bing translate
deepL
The file &amp;quot;default.select&amp;quot; defines menus for selected text. If no text is selected, the menu item operates on the whole page. Each line of the file has the following format:
[Name]:[mimetype]:[command line]
[mimetype] specifies input/output for [command line].
It formats as &amp;quot;[input mimetype]/[output mimetype]&amp;quot;.
[input mimetype] can be the following:
&amp;quot;html&amp;quot;: rich text &amp;quot;&amp;quot; (empty): text &amp;quot;.</description>
</item> </item>
</channel> </channel>
</rss> </rss>

Some files were not shown because too many files have changed in this diff Show more