mirror of
https://github.com/torappinfo/uweb.git
synced 2024-08-14 23:54:59 +00:00
Compare commits
493 commits
Author | SHA1 | Date | |
---|---|---|---|
|
aa0342a5de | ||
|
1cae16f750 | ||
|
3d64e218e7 | ||
|
e469cb1a87 | ||
|
47777c299e | ||
|
b2e9cd1d31 | ||
|
7792c764b2 | ||
|
e4da0e72b8 | ||
|
9d005633c8 | ||
|
093a4ef3ff | ||
|
5d062edbfa | ||
|
5e3172ece0 | ||
|
f3ea023929 | ||
|
6fc7d22514 | ||
|
e28838f738 | ||
|
c8c7c4e896 | ||
|
cbfffcd34f | ||
|
00ccd791ed | ||
|
8367164d73 | ||
|
ad1d9e33b7 | ||
|
c00e3a1f09 | ||
|
725917a939 | ||
|
c60d325354 | ||
|
895c3124f9 | ||
|
1577313e59 | ||
|
536ff07ffa | ||
|
d28fe3eed2 | ||
|
052cb9dad1 | ||
|
9acd6f4a24 | ||
|
2e2b048336 | ||
|
17932d8843 | ||
|
e29bf0538d | ||
|
7990d17849 | ||
|
070d64e7e2 | ||
|
c3173e0f97 | ||
|
5f2116943f | ||
|
eba6f63b7f | ||
|
2cc5b79da4 | ||
|
d0d745b7f5 | ||
|
7eccedfecc | ||
|
8eb8e9e41f | ||
|
d2bab81cbb | ||
|
b2fb3b0d3c | ||
|
45cce01aaa | ||
|
b3dbc53138 | ||
|
81c65f4beb | ||
|
54c5b4cb51 | ||
|
9bb616264f | ||
|
cad15caa9a | ||
|
561c618cf6 | ||
|
4844f0cb42 | ||
|
a4c5482286 | ||
|
a36d892846 | ||
|
e16ae4bfd9 | ||
|
a0f510ca9a | ||
|
5f260a728d | ||
|
f75b1ed6f2 | ||
|
0d2f4adee1 | ||
|
f61e10f836 | ||
|
0dc5a32fa4 | ||
|
e7c63d0df2 | ||
|
94cc23df0a | ||
|
b4c443b85c | ||
|
271c6b869d | ||
|
851d92a3b6 | ||
|
d1b5317474 | ||
|
7ebb517e24 | ||
|
93cccb211b | ||
|
ed565d9960 | ||
|
75cb8c0c1e | ||
|
21e0757831 | ||
|
4b66fe2881 | ||
|
b7b4361758 | ||
|
8e88f74c4e | ||
|
ed527c7bf1 | ||
|
922481d142 | ||
|
f8c5a9312e | ||
|
f86d763d67 | ||
|
67b2f74f41 | ||
|
1fa57a6ca4 | ||
|
0ecceefb88 | ||
|
fa8bedbedb | ||
|
ee1356f7d0 | ||
|
5442aa85ef | ||
|
36008d74e6 | ||
|
0b0584e39d | ||
|
1502209acb | ||
|
b9d6b27bee | ||
|
af87a9130d | ||
|
c0a6690dd8 | ||
|
d4d932689d | ||
|
b65e9b48ca | ||
|
0a5707bb0d | ||
|
4aceddcd7c | ||
|
1106e4b018 | ||
|
f84f7442eb | ||
|
c2174435e7 | ||
|
d9497853ad | ||
|
b4ceca9041 | ||
|
534cf21eb0 | ||
|
5c230a12c2 | ||
|
94dedf19c6 | ||
|
7d1b8278b9 | ||
|
1744d90c59 | ||
|
e381ccbf2d | ||
|
2e6ca5bed4 | ||
|
8199f16d10 | ||
|
6e8ede8dd8 | ||
|
9f8edef028 | ||
|
22277c08c3 | ||
|
68fa9617be | ||
|
a894ae8777 | ||
|
f308403a3e | ||
|
9628d3785f | ||
|
fff6341182 | ||
|
e51739f1be | ||
|
6433faf02d | ||
|
ddd20f6bc8 | ||
|
a83084f300 | ||
|
a0e5977a59 | ||
|
892c611c60 | ||
|
e4962ac9fb | ||
|
bf47ae2390 | ||
|
6db5a47d1a | ||
|
515787c68d | ||
|
a494f53d9a | ||
|
8a811bf2e4 | ||
|
df638a8b49 | ||
|
7dfc274768 | ||
|
225fd5c802 | ||
|
951d607c7c | ||
|
faeac627be | ||
|
809dd08489 | ||
|
9edd84c037 | ||
|
dec6cd1ab9 | ||
|
3715fd6cb5 | ||
|
5979fc0d80 | ||
|
ac37de825e | ||
|
7adfd0f544 | ||
|
914d1cfca2 | ||
|
9f3fdb6d20 | ||
|
d15c4e25d0 | ||
|
8393f2652c | ||
|
12b3563708 | ||
|
36182a2a88 | ||
|
4039a5b8ec | ||
|
1234ce175a | ||
|
fa884c32a7 | ||
|
b8d5451d77 | ||
|
1ae8341d4a | ||
|
301b52f556 | ||
|
139cf75218 | ||
|
a511f972c8 | ||
|
0a4c6a9474 | ||
|
8fcac14ac0 | ||
|
b17aaf4116 | ||
|
bfb5e7c079 | ||
|
f88fab17b2 | ||
|
8e42c8b7ac | ||
|
63eee8ebb5 | ||
|
e42712c71a | ||
|
074affaa54 | ||
|
8c6754186c | ||
|
1fb143ab1b | ||
|
437fc7a2b4 | ||
|
f93cedd1dd | ||
|
6304d5594a | ||
|
3239bb8dec | ||
|
33d2db03b7 | ||
|
a2c2729725 | ||
|
940df7475f | ||
|
58edc855cd | ||
|
ef45cb87c9 | ||
|
2c2f15bfa9 | ||
|
63077ffe8f | ||
|
f736bbfd88 | ||
|
a548a5d8a5 | ||
|
57dc4d61f8 | ||
|
3a3118c61a | ||
|
fbf6635c1a | ||
|
21600e4acf | ||
|
6aab9abf2c | ||
|
c533099e82 | ||
|
840fca625b | ||
|
08959823db | ||
|
88c107828b | ||
|
7d27ea2485 | ||
|
7f43a7d7d4 | ||
|
d43d3e3dfc | ||
|
f536c6eb78 | ||
|
a1f7adb7f0 | ||
|
594fcf767d | ||
|
087b9df6b6 | ||
|
a8700372f4 | ||
|
2d72f7825a | ||
|
7e7871f764 | ||
|
54c1db0255 | ||
|
f8529dc7de | ||
|
eb328d7609 | ||
|
a413b5f1d0 | ||
|
e4906dfd26 | ||
|
78552b5e5a | ||
|
d082e9cf5b | ||
|
56a0c2f36f | ||
|
a9bdb08c77 | ||
|
dfc14dae10 | ||
|
398ba8c89a | ||
|
e9ecf66872 | ||
|
99f6e7d2c7 | ||
|
bef3445154 | ||
|
830c97bf91 | ||
|
64224d5cc6 | ||
|
6e30989d56 | ||
|
df40846eb5 | ||
|
fc717a7c90 | ||
|
50c0037c97 | ||
|
9f7bb0ba52 | ||
|
c2b605ec3b | ||
|
a3dc816f34 | ||
|
7a254b0d0e | ||
|
ae108ac8bb | ||
|
ad4cc42d67 | ||
|
8f2c1c9ad0 | ||
|
6ae4b1bb30 | ||
|
b21c1074d7 | ||
|
acef3cbd59 | ||
|
d71ea8e173 | ||
|
c29eb47b8b | ||
|
5951fe139a | ||
|
cad6049847 | ||
|
6f832ad3d9 | ||
|
8ea7d1e5a9 | ||
|
577cf5c6f6 | ||
|
a81920a1a5 | ||
|
18b9609a23 | ||
|
ed25fd1dd7 | ||
|
a7caf970e6 | ||
|
2704b2f1cc | ||
|
032723db19 | ||
|
1239ef166c | ||
|
13fbe1c9af | ||
|
0e70132833 | ||
|
8998d08b42 | ||
|
1ba51cb179 | ||
|
e35f094c97 | ||
|
96b13242b5 | ||
|
668562f292 | ||
|
cb565e5567 | ||
|
6a726e893c | ||
|
441db3a1f4 | ||
|
95c5410f00 | ||
|
e8b5f412f0 | ||
|
9ea6258d40 | ||
|
c9f0db1c34 | ||
|
3672627e81 | ||
|
bfa1a68ed2 | ||
|
2ac6107614 | ||
|
74511d89e0 | ||
|
e3f545c03f | ||
|
fcc8fe4f5e | ||
|
89edcd3d46 | ||
|
a853a7bb2b | ||
|
ed2b96f46c | ||
|
37e1fae65a | ||
|
ed7de221d0 | ||
|
23e9a9179d | ||
|
50f156dc6b | ||
|
e20a424290 | ||
|
cd7f1f9cea | ||
|
b01672cb48 | ||
|
25bb54f62c | ||
|
c8a8b0214f | ||
|
9ec7186e34 | ||
|
5dcba20904 | ||
|
62f3a10994 | ||
|
4f5a15cb23 | ||
|
7146aff7c9 | ||
|
8741779b66 | ||
|
5b3b3fe5d1 | ||
|
9dc075503b | ||
|
4e8ff416e7 | ||
|
ddc9c8c16d | ||
|
2817b68a19 | ||
6acc1ed1aa | |||
|
cb2324e4c2 | ||
|
925e3f6299 | ||
|
decb1cf49e | ||
|
400048f1d9 | ||
|
56efdbbe18 | ||
|
cd0754d0ff | ||
|
0c9c73951d | ||
|
be15410d97 | ||
|
6f2aa9ea4d | ||
|
3e389ad454 | ||
|
024fa60e19 | ||
|
75faa15b83 | ||
|
a6aabed862 | ||
|
425e0c74d1 | ||
|
673e457978 | ||
|
57a397d7a3 | ||
|
71c2987cf9 | ||
|
94bf28a6ba | ||
|
e7afdd0dae | ||
|
e50056c68d | ||
|
e6f0ef87e5 | ||
|
d6a016d487 | ||
|
e367af94be | ||
|
457e012713 | ||
|
0d9d30d783 | ||
|
b0147c8c85 | ||
|
8fde5df446 | ||
|
cd12841352 | ||
|
1ed0b0c7ca | ||
|
5838a014cf | ||
|
c124197dbe | ||
|
e7700877a8 | ||
|
3b6a36a2fa | ||
|
d4bc203492 | ||
|
0d1241bec5 | ||
|
8d64d0ede0 | ||
|
af3cad969b | ||
|
491856eb1f | ||
|
6c53b64adf | ||
|
668af3d194 | ||
|
bc8110325b | ||
|
7399d1b5cd | ||
|
f5d2345718 | ||
|
287897b960 | ||
|
612af3a880 | ||
|
349e7e629d | ||
|
3eacdfbe86 | ||
|
7c38fa2615 | ||
|
53d34196b6 | ||
|
b3d7263d59 | ||
|
a3147eaa1a | ||
|
3ecbea5097 | ||
|
632302bd68 | ||
|
472a62a35b | ||
|
36012141dd | ||
|
77a7fc60be | ||
|
b96d51b85d | ||
|
d05e18ea53 | ||
|
db629abf0f | ||
|
cd87cc793c | ||
|
aeec3960f5 | ||
|
92b697afe2 | ||
|
e45e124b2a | ||
|
738ded93be | ||
|
035797ab60 | ||
|
e76d93f0d1 | ||
|
dca1cb1170 | ||
|
f6d1022757 | ||
|
75546688a1 | ||
|
e9f6a03637 | ||
|
ed6f827379 | ||
|
732adfa362 | ||
|
b0aaa72b31 | ||
|
68014621bb | ||
|
79f9980fb5 | ||
|
71fb1c09eb | ||
|
439cf52e37 | ||
|
8a502e4532 | ||
|
228a6ea84c | ||
|
1a202f5bfc | ||
|
7b4e088180 | ||
|
cfd4961502 | ||
|
8e7b56a157 | ||
|
ec4d107f65 | ||
|
7765bb0ccb | ||
|
4d933cd0fe | ||
|
7b97504629 | ||
|
f7374ef3b7 | ||
|
e1bebd1fdd | ||
|
64ee36ca58 | ||
|
4a71bfda3b | ||
|
d559a9b550 | ||
|
46de690e7b | ||
|
8bb1645e7c | ||
|
2d016e3fdb | ||
|
939b257389 | ||
|
c0e90a6090 | ||
|
3cb1a66d80 | ||
|
1ca754c378 | ||
|
89b2e24890 | ||
|
7eddea74b8 | ||
|
9038a9df17 | ||
|
073f5f94c3 | ||
|
3d6951e99a | ||
|
a79d00b323 | ||
|
c408fd8407 | ||
|
b5462e600b | ||
|
22d028d2dd | ||
|
708290b421 | ||
|
b4cd28c645 | ||
|
ad2ad04b47 | ||
|
eb30780475 | ||
|
ddcf396b11 | ||
|
f82c34ba62 | ||
|
e707f7a0d4 | ||
|
8d1c9b7e05 | ||
|
d860ea6c4c | ||
|
e9c8492f9d | ||
|
2f3eee32c2 | ||
|
716e044ad5 | ||
|
cd9dfe966d | ||
|
91ee053229 | ||
|
7c345eaa89 | ||
|
5a69ed9e76 | ||
|
fb32812e7b | ||
|
28da258433 | ||
|
5bcae803c8 | ||
|
8a9d4b8284 | ||
|
dc877d91b0 | ||
|
57b3a69535 | ||
|
1a813a7bd4 | ||
|
7df4f9b034 | ||
|
312bc28def | ||
|
4fd4f72264 | ||
|
1399e83305 | ||
|
4212feb617 | ||
|
70b828eba7 | ||
|
197aded3ca | ||
|
8367fd641a | ||
|
258e18ffd5 | ||
|
d129d310c9 | ||
|
5fdd9e45f6 | ||
|
dc5bab9f17 | ||
|
d9de58e5e5 | ||
|
fa127bb88e | ||
|
cf79a7086b | ||
|
154e688892 | ||
|
fe41bb41a4 | ||
|
ad12551ed7 | ||
|
765740a73f | ||
|
a0bd1d23c8 | ||
|
cdbea0e775 | ||
|
c40f3d056d | ||
|
75a1ce6f8a | ||
|
936181547e | ||
|
c033aee378 | ||
|
32fb5a8ee2 | ||
|
323189f48d | ||
|
0728ce81f7 | ||
|
e82c754b00 | ||
|
b6eb718e75 | ||
|
bc83b5c0f9 | ||
|
da31e9824f | ||
|
896eb174d3 | ||
|
66a1f529f6 | ||
|
aab85e6670 | ||
|
062a4023a2 | ||
|
a2ad390c55 | ||
|
e1b83a0c77 | ||
|
ab3dc78bb1 | ||
|
0816b56023 | ||
|
c07bb20e5c | ||
|
74d676ab67 | ||
|
ce8624c4f5 | ||
|
9dab7fa895 | ||
|
a97710929d | ||
|
d8c79c22e0 | ||
|
3c1095936f | ||
|
c5845bc3dd | ||
|
a93ccd08d3 | ||
|
a31c2f276c | ||
|
0694165c0a | ||
|
eb59eb477e | ||
|
0460249b84 | ||
|
d432ee2d46 | ||
|
ff9f26ebbc | ||
|
3d731c7e4a | ||
|
6081e5c1af | ||
|
a35c3ed6a9 | ||
|
3bf02f77a7 | ||
|
47c46dc01a | ||
|
26bfc316fc | ||
|
1d24854e0b | ||
|
4087db750e | ||
|
c6909f2fbb | ||
|
368ab38699 | ||
|
d6fae7beef | ||
|
04912cdc03 | ||
|
f43b1ebbaf | ||
|
a17b53dc11 | ||
|
feabfe5407 | ||
|
a64fc68def | ||
|
6302501dca | ||
|
7ebcc56f11 | ||
|
9e3c8143b9 | ||
|
69b8d15a8c | ||
|
9ee06e8a09 | ||
|
358bb90db0 | ||
|
ac3c78e978 |
274 changed files with 17342 additions and 5144 deletions
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
*.apk filter=lfs diff=lfs merge=lfs -text
|
10
.gitlab-ci.yml
Normal file
10
.gitlab-ci.yml
Normal 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
0
LICENSE
Normal file
61
README.md
61
README.md
|
@ -1,6 +1,57 @@
|
|||
#### Uweb browser
|
||||
[Uweb browser: updates, plugins and tips](https://torappinfo.github.io/uwebzh/en)
|
||||
### Uweb browser: minimal suckless web browser with unlimited power
|
||||
<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)
|
||||
[netlify](https://uwebzh.netlify.app/en)
|
||||
[pages](https://uwebzh.pages.dev/en))
|
||||
[Amazon appstore](https://www.amazon.com/TorApp-Info-uweb-browser-for-geeks/dp/B098QPR6N5)
|
||||
[Galaxy.Store](https://galaxy.store/uweb)
|
||||
<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/) [codeberg](https://jamesfengcao.codeberg.page/en/) [repo](https://repo.or.cz/uweb.git/blob_plain/HEAD:/en/index.html) [4everland](https://uweb.4everland.app/en/) [fleek](https://uweb.on-fleek.app/en/) [cyclic](https://muweb.cyclic.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/) [deno](https://posh-crab-23.deno.dev/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/) [glitch](https://uweb.glitch.me/en/) <a href="en/mirrors.md" onclick="if(notRepo()){location='../../en/mirrors/index.html#';return false;}">More...</a>)
|
||||
|
||||
- Powerful: any native functionality with html5 enhancement and still secure; any urls to host website; javascript and shell scripting for general processing; piping between console and GUI and more with Termux.
|
||||
- Customizable: user-defined menus, (new) buttons and gestures for user agents, bookmarklets, url services, shell commands, internal functionality links and text processing etc.
|
||||
- Convenient: Any AI chatbot/book (pdf/djvu)/dictionary (mdict)/txt/command line/app/webapp (web extensions) can be 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.
|
||||
- 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, enabling html5 apps for local files (pdf/djvu/epub viewer, mdict dictionary lookup etc.).
|
||||
|
||||
- User-defined global and site-specific CSS and javascript.
|
||||
- Bookmarklets (works for CSP sites and with option to auto apply to similar sites)
|
||||
- AD blocking (block whole root domain trees etc.)
|
||||
- Customization (define extra menus/buttons/gestures with user-defined functionalities)
|
||||
- Support shell scripts, javascript for general processing, other languages (python etc.) are also supported by installing uweb compatible Termux versions.
|
||||
- Serverless local sites: PWA-kind web extension (chrome .crx & firefox .xpi) support.
|
||||
- Piping between console and uweb tabs.
|
||||
- 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
|
||||
|
|
62
README.zh-Hans.md
Normal file
62
README.zh-Hans.md
Normal file
|
@ -0,0 +1,62 @@
|
|||
### 超微浏览器 (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://galaxy.store/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)
|
||||
(镜像: [atomgit](https://uweb.atomgit.net/uweb/zh/) [gitlab](https://jamesfengcao.gitlab.io/uweb/zh/) [repo](https://repo.or.cz/uweb.git/blob_plain/HEAD:/zh/index.html) [codeberg](https://jamesfengcao.codeberg.page/zh/) [4everland](https://uweb.4everland.app/zh/) [cyclic](https://muweb.cyclic.app/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/) [deno](https://posh-crab-23.deno.dev/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/) [glitch](https://uweb.glitch.me/zh/) [zeabur](https://uweb.zeabur.app/zh/) [vercel](https://uweb.vercel.app/zh/) <a href="en/mirrors.md" onclick="if(notRepo()){location='../../en/mirrors/index.html#';return false;}">专用镜像...</a>)
|
||||
|
||||
- <span style="color:red">免魔法国内直接访问英文技术网站如<a href="zh/tips.md" onclick="if(notRepo()){location='../tips/index.html#';return false;}">google、百科等</a></span>
|
||||
- AI聊天可作为搜索引擎来使用。
|
||||
- 完善的下载支持,部分网站下载其它浏览器无法成功。
|
||||
- 微:不到250K。
|
||||
- 威:无穷无尽的功能,使用增强后的html5可以实现任何本地应用功能。支持使用js脚本、url服务、shell命令、内部功能链接定制菜单/(新)按钮/手势; 远程数据皆可成网站。
|
||||
- 便捷:AI聊天/图书(pdf/djvu)/txt/词典(mdict,kiwix)/命令行/APP/webapp(web extensions)可作为搜索引擎使用。
|
||||
- 快:手机越慢,脚本插件越多越明显。
|
||||
- 高效:最少的操作,在线服务全自动(参看常用链接网页)。
|
||||
- 极致优化:最少存储写操作,比如浏览器转到后台前配置变化如恢复成原样则无写操作。
|
||||
- 地址栏支持命令行 ("!", 物理键盘支持更佳)
|
||||
- 指定域名: 用户定义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,禁用脚本,无图,激活脚本)、行编辑器、代码编辑器(支持120多种语言,语法高亮、错误提示、自动提示、直接运行测试、其它网页上直接测试)。通过安装html5应用可预览/阅读本地或在线任意格式文件(pdf,djvu,epub,mdx/mdd,docx等)。
|
||||
|
||||
修仙小说里面有一种异能,叫做“成功可以复制”,只要成功一次,就能无限复制。超微浏览器中这种异能叫"超级书签"。成功使用时保存,需要时就可以无限恢复。
|
||||
|
||||
小书签(bookmarklet)再也不用手工输入,直接将小书签网站加入书签即可。运行时长按出菜单后选择“在新窗口中打开”,小书签将作用于最后一个窗口。
|
||||
|
||||
独创不良信息绝杀:阻止指定根域名的一切子域名、孙域名...,不良信息一网打尽。 支持根域名前缀、网址路径正则表达式。
|
||||
|
||||
独创脚本激活模式,脚本执行后被激活,此后自动作用于同类网址。
|
||||
|
||||
支持全局用户脚本/样式,可任意叠加,轻松切换。
|
||||
|
||||
支持网址特定脚本/样式,可轻松支持百万以上不同脚本。
|
||||
|
||||
支持自定义任意多个搜索引擎; 支持执行用户提供任何js文件; 支持用户定义任意多个useragent; 长按链接支持运行第三方程序; 长按链接支持运行用户js文件。
|
||||
|
||||
配套安装uWeb定制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平面设计。
|
||||
- 完全开源,共同探索浏览新技术。
|
62
README.zh.md
Normal file
62
README.zh.md
Normal file
|
@ -0,0 +1,62 @@
|
|||
### 超微浏览器 (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://galaxy.store/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)
|
||||
(镜像: [atomgit](https://uweb.atomgit.net/uweb/zh/) [gitlab](https://jamesfengcao.gitlab.io/uweb/zh/) [repo](https://repo.or.cz/uweb.git/blob_plain/HEAD:/zh/index.html) [codeberg](https://jamesfengcao.codeberg.page/zh/) [4everland](https://uweb.4everland.app/zh/) [cyclic](https://muweb.cyclic.app/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/) [deno](https://posh-crab-23.deno.dev/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/) [glitch](https://uweb.glitch.me/zh/) [zeabur](https://uweb.zeabur.app/zh/) [vercel](https://uweb.vercel.app/zh/) <a href="en/mirrors.md" onclick="if(notRepo()){location='../../en/mirrors/index.html#';return false;}">专用镜像...</a>)
|
||||
|
||||
- <span style="color:red">免魔法国内直接访问英文技术网站如<a href="zh/tips.md" onclick="if(notRepo()){location='../tips/index.html#';return false;}">google、百科等</a></span>
|
||||
- AI聊天可作为搜索引擎来使用。
|
||||
- 完善的下载支持,部分网站下载其它浏览器无法成功。
|
||||
- 微:不到250K。
|
||||
- 威:无穷无尽的功能,使用增强后的html5可以实现任何本地应用功能。支持使用js脚本、url服务、shell命令、内部功能链接定制菜单/(新)按钮/手势; 远程数据皆可成网站。
|
||||
- 便捷:AI聊天/图书(pdf/djvu)/txt/词典(mdict,kiwix)/命令行/APP/webapp(web extensions)可作为搜索引擎使用。
|
||||
- 快:手机越慢,脚本插件越多越明显。
|
||||
- 高效:最少的操作,在线服务全自动(参看常用链接网页)。
|
||||
- 极致优化:最少存储写操作,比如浏览器转到后台前配置变化如恢复成原样则无写操作。
|
||||
- 地址栏支持命令行 ("!", 物理键盘支持更佳)
|
||||
- 指定域名: 用户定义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,禁用脚本,无图,激活脚本)、行编辑器、代码编辑器(支持120多种语言,语法高亮、错误提示、自动提示、直接运行测试、其它网页上直接测试)。通过安装html5应用可预览/阅读本地或在线任意格式文件(pdf,djvu,epub,mdx/mdd,docx等)。
|
||||
|
||||
修仙小说里面有一种异能,叫做“成功可以复制”,只要成功一次,就能无限复制。超微浏览器中这种异能叫"超级书签"。成功使用时保存,需要时就可以无限恢复。
|
||||
|
||||
小书签(bookmarklet)再也不用手工输入,直接将小书签网站加入书签即可。运行时长按出菜单后选择“在新窗口中打开”,小书签将作用于最后一个窗口。
|
||||
|
||||
独创不良信息绝杀:阻止指定根域名的一切子域名、孙域名...,不良信息一网打尽。 支持根域名前缀、网址路径正则表达式。
|
||||
|
||||
独创脚本激活模式,脚本执行后被激活,此后自动作用于同类网址。
|
||||
|
||||
支持全局用户脚本/样式,可任意叠加,轻松切换。
|
||||
|
||||
支持网址特定脚本/样式,可轻松支持百万以上不同脚本。
|
||||
|
||||
支持自定义任意多个搜索引擎; 支持执行用户提供任何js文件; 支持用户定义任意多个useragent; 长按链接支持运行第三方程序; 长按链接支持运行用户js文件。
|
||||
|
||||
配套安装uWeb定制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平面设计。
|
||||
- 完全开源,共同探索浏览新技术。
|
112
assets/help_en.html
Normal file
112
assets/help_en.html
Normal file
|
@ -0,0 +1,112 @@
|
|||
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width" /><base href=../en/><title>Manual</title></head><body>
|
||||
<center><b>Manual</b> <a href="i:1fhelp_zh">中文</a></center>
|
||||
|
||||
<b>Frequently visited links::</b><br>
|
||||
<a href="index.html">Updates, plugins and 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://uweb.4everland.app/en/">4everland</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="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:///sdcard/Download/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.<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 management; long press for <a target="_blank" href="file:///data/data/info.torapp.uweb/files/css/">global css</a>.</li>
|
||||
<li>[🏠]Home screen: long press for new tab. </li>
|
||||
<li>[☰] more tools; long pressed to configure <a target="_blank" href="file:///data/data/info.torapp.uweb/files/js/">global javascripts</a>.</li>
|
||||
</ul>
|
||||
|
||||
<b>More tools::</b><br>
|
||||
<ul>
|
||||
<li>[🖥️]PC: fake as desktop PC; long press for <a href=file:///data/data/info.torapp.uweb/files/default.uas>more UAs</a>.</li>
|
||||
<li>[JS] disable/enable javascript; long press for <a target="_blank" href="file:///data/data/info.torapp.uweb/files/bookmarklet/">more javascripts</a>.</li>
|
||||
<li>[IMG] hide/show images; long press for <a href=file:///data/data/info.torapp.uweb/files/default.urls>more services</a>. <a href="urls/index.html">details</a></li>
|
||||
<li>[☆] add bookmark; long press for <a href=file:///data/data/info.torapp.uweb/files/default.link>links menu</a>. <a href="links/index.html">details</a></li>
|
||||
<li>[🕔] history, long press for <a href=file:///data/data/info.torapp.uweb/files/default.cmds>user defined commands</a>. <a href="cmds/index.html">details</a></li>
|
||||
<li>[🔍 Magnifier] search in the current page; long press for <a href=file:///data/data/info.torapp.uweb/files/default.rjs>remote scripts</a>. <a href="rjs/index.html">details</a></li>
|
||||
<li>[🔗]Copy link, long press for <a href=file:///data/data/info.torapp.uweb/files/default.select>menus for text selection</a>. <a href="textprocess/index.html">details</a></li>
|
||||
<li>[X]Exit browser, long press for <a href=file:///data/data/info.torapp.uweb/files/default.input>input phrases</a>.</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.</li>
|
||||
<li>Share the url: <a href="textprocess/index.html">process clipboard text</a> when in home screen, otherwise share the page url.</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="http://jamesfengcao.gitee.io/uweb/sitejs/">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><a href=file:///data/data/info.torapp.uweb/files/default.acmd>Address bar mode</a></li>
|
||||
</ul>
|
||||
|
||||
<b><a id="mirrors">More mirrors</a>::</b><br>
|
||||
<a href="i:0mi:5h:https://fastly.jsdelivr.net/gh/torappinfo/uweb/redirect.html">Test1</a>
|
||||
<a href="i:0m?: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="i:0m?:https://notabug.org/torappinfo/uweb/raw/master/redirect.html">Test5</a>
|
||||
<a href="i:0mi:5h:https://git.launchpad.net/uweb/plain/redirect.html">Test6</a>
|
||||
<a href="i:0m?:https://framagit.org/torappinfo/uweb/-/raw/master/redirect.html">Test7</a>
|
||||
<a href="i:0m?:https://agit.ai/jamesfengcao/uweb/raw/branch/master/redirect.html">Test8</a>
|
||||
<a href="i:0m?:https://git.froggi.es/jamesfengcao/uweb/raw/branch/master/redirect.html">Test9</a>
|
||||
<a href="i:0m?:https://git.disroot.org/torappinfo/uweb/raw/branch/master/redirect.html">Test10</a>
|
||||
<a href="i:0m?:https://gitdab.com/jamesfengcao/uweb/raw/branch/master/redirect.html">Test11</a>
|
||||
<a href="i:0mi:5h: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="i:0m?:https://gitcode.net/uweb/uweb/-/raw/master/redirect.html">Test15</a>
|
||||
<a href="i:0mi:5h:https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html">Test17</a>
|
||||
<a href="i:0m?:https://dagshub.com/torappinfo/uweb/raw/master/redirect.html">dagshub</a>
|
||||
<a href="i:0mi:5h:https://gitgud.io/jamesfengcao/uweb/-/raw/master/redirect.html">gitgud</a>
|
||||
|
||||
|
||||
<br><br>
|
||||
<a href="https://github.com/torappinfo/uweb">Project home</a><br>
|
||||
</body></html>
|
167
assets/help_zh.html
Normal file
167
assets/help_zh.html
Normal file
|
@ -0,0 +1,167 @@
|
|||
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width" /><base href=../zh/><title>使用攻略</title></head><body>
|
||||
<center><b>使用攻略</b> <a href="i:1fhelp_en">English</a></center>
|
||||
<a href="i:0mi:5h:https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html">更新、插件、设置及技巧</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://uweb.4everland.app/zh/">4everland</a>
|
||||
<a href="https://muweb.cyclic.app/zh/">cyclic</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="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:///sdcard/Download/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 target="_blank" href="file:///data/data/info.torapp.uweb/files/css/">全局用户css样式选项</a>。</li>
|
||||
<li>主屏,长按打开新窗口。</li>
|
||||
<li>[☰] 更多工具;长按弹出<a target="_blank" href="file:///data/data/info.torapp.uweb/files/js/">全局js脚本设置</a>。</li>
|
||||
</ul>
|
||||
|
||||
更多工具:
|
||||
<ul>
|
||||
<li>[🖥️]PC: 伪装成桌面浏览器;长按则在左上角弹出菜单显示更多<a href=file:///data/data/info.torapp.uweb/files/default.uas>用户配置UA</a>。</li>
|
||||
<li>[JS] 关闭/打开javascript支持;长按显示<a target="_blank" href="file:///data/data/info.torapp.uweb/files/bookmarklet/">更多脚本功能</a>。</li>
|
||||
<li>[IMG] 关闭/打开图像显示;长按显示更多<a href=file:///data/data/info.torapp.uweb/files/default.urls>特色服务</a>。<a href="urls/index.html">攻略</a></li>
|
||||
<li>[☆] 添加书签;长按显示常用链接。<a href="links/index.html">攻略</a></li>
|
||||
<li>[🕔] 访问历史,长按显示<a href=file:///data/data/info.torapp.uweb/files/default.cmds>预定义命令</a>菜单。<a href="cmds/index.html">攻略</a></li>
|
||||
<li>[🔍]页面搜索:长按唤出<a href=file:///data/data/info.torapp.uweb/files/default.rjs>远程脚本菜单</a>。<a href="rjs/index.html">攻略</a></li>
|
||||
<li>[🔗]复制链接:长按显示菜单,<a href=file:///data/data/info.torapp.uweb/files/default.select>对选中内容作用户定义操作</a>。<a href="textprocess/index.html">攻略</a></li>
|
||||
<li>[X]退出浏览器:长按显示<a href=file:///data/data/info.torapp.uweb/files/default.input>输入法短语</a>.</li>
|
||||
<li>[▽]底部</li>
|
||||
<li>[△]顶部</li>
|
||||
<li>[🔊]朗读: 优先朗读顶部工具条搜索栏非网址内容、网页选中内容,最后为整个网页。再次朗读可中断上次朗读操作,地址栏朗读专为学习外语单词发音而设计。</li>
|
||||
<li>网址分享:主屏下对剪贴板数据进行<a href="textprocess/index.html">文本处理</a>。</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/">执行网站用户脚本</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>地址栏功能选择</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.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="i:0mi:5h:https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html">试验1</a>
|
||||
<a href="i:0m?:https://gitcode.net/uweb/uweb/-/raw/master/redirect.html">2</a>
|
||||
|
||||
<a href="i:0m?:https://raw.gitcode.com/uweb/uweb/raw/master/redirect.html">4</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://agit.ai/jamesfengcao/uweb/raw/branch/master/redirect.html">11</a>
|
||||
<a href="i:0m?:https://git.froggi.es/jamesfengcao/uweb/raw/branch/master/redirect.html">12</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://repo.palemoon.org/jamesfengcao/uweb/raw/branch/master/redirect.html ">palemoon</a>
|
||||
<a href="i:0m?:https://tildegit.org/jamesfengcao/uweb/raw/branch/master/redirect.html">tilde</a>
|
||||
<a href="i:0m?:https://git.dotclear.org/jamesfengcao/uweb/raw/branch/master/redirect.html">dotclear</a>
|
||||
<a href="i:0m?:https://git.minetest.land/jamesfengcao/uweb/raw/branch/master/redirect.html ">minetest</a>
|
||||
<a href="i:0m?:https://forge.chapril.org/jamesfengcao/uweb/raw/branch/master/redirect.html">chapril</a>
|
||||
<a href="i:0m?:https://git.cryto.net/jamesfengcao/uweb/raw/branch/master/redirect.html ">cryto</a>
|
||||
<a href="i:0m?:https://code.antopie.org/jamesfengcao/uweb/raw/branch/master/redirect.html">antopie</a>
|
||||
|
||||
<a href="https://uweb.zeabur.app/zh/">zeabur</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>
|
||||
</body></html>
|
|
@ -1,188 +1,180 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>_posts on </title>
|
||||
<title>_Posts on uweb browser: unlimited power</title>
|
||||
<link>/en/_posts/</link>
|
||||
<description>Recent content in _posts on </description>
|
||||
<generator>Hugo -- gohugo.io</generator>
|
||||
<lastBuildDate>Sat, 02 Jul 2022 00:00:00 +0000</lastBuildDate><atom:link href="/en/_posts/index.xml" rel="self" type="application/rss+xml" />
|
||||
<description>Recent content in _Posts on uweb browser: unlimited power</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Fri, 19 Jul 2024 10:06:21 +0800</lastBuildDate>
|
||||
<atom:link href="/en/_posts/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Site map</title>
|
||||
<link>/en/sitemap/</link>
|
||||
<pubDate>Sat, 02 Jul 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/sitemap/</guid>
|
||||
<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>
|
||||
<title>Text selection/processing</title>
|
||||
<link>/en/textprocess/</link>
|
||||
<pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/textprocess/</guid>
|
||||
<description>Click the following links to install menus for long pressing the button &quot;link&quot;:
note.ms: cloud text sharing, please replace &quot;ric&quot; with your favorite ID
Copy selected text with html format to clipboard
Search with home screen
google Translate
bing translate
deepL
The file &quot;default.select&quot; 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:</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Links</title>
|
||||
<link>/en/links/</link>
|
||||
<pubDate>Sat, 28 Oct 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/links/</guid>
|
||||
<description>Click the following links to install menus popped by long pressing the bookmark button (with star as icon):
Capture long screenshot (need long screenshot mode)
Select All:CTRL-A/undo:CTRL-Z/Redo:CTRL-Y
Extend site cookies to 10 years
Clear site cookies
VPN
Switch configuration
Wait for network msg
Certificate info
Backup to box.com
Restore from box.com
upload to box.com
More webdav link menu items
Web fullscreen
Long pressing the bookmark button in uweb browser will popup menus defined in file &quot;default.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>cron</title>
|
||||
<link>/en/tcron/</link>
|
||||
<pubDate>Wed, 25 Oct 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tcron/</guid>
|
||||
<description>crontab (with enhanced semantics) For performance, the file &quot;crontab&quot; uses single space as field separator. Letters are not suppored currently. So use &quot;1&quot; for &quot;January&quot; and 2 for &quot;Tuesday&quot; etc.
The sixth field in crontab file could be in the format of internal links. Specifically, &quot;c:&quot; to execute the following commands in termux and &quot;!&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.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Offline resources</title>
|
||||
<link>/en/offlinecache/</link>
|
||||
<pubDate>Tue, 11 Apr 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/offlinecache/</guid>
|
||||
<description>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.
Serverless local sites Click to install url service that extracts web apps to the folder &quot;sitecache/local/&quot;: support web extensions (.crx for chrome &amp; .xpi for firefox).
Any folder under &quot;sitecache&quot; can be visited as a local site.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Resource redirection</title>
|
||||
<link>/en/redirect/</link>
|
||||
<pubDate>Tue, 11 Apr 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/redirect/</guid>
|
||||
<description>⚠️Redirection forwards cookies with the setting option &quot;Redirect cookies&quot; enabled, so use the options with care.
Setting options: &quot;Url redirection&quot; vs. &quot;Resource redirection&quot; &quot;Url redirection&quot; redirects the main/page url only while &quot;Resource redirection&quot; is for all urls in the page.
Global redirection Global redirection is enabled with the setting option &quot;Resource redirection&quot; or both &quot;Url redirection&quot; and &quot;Redirect cookies&quot;.
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.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Hosts files</title>
|
||||
<link>/en/adblock_domain/</link>
|
||||
<pubDate>Mon, 20 Mar 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/adblock_domain/</guid>
|
||||
<description>The enhanced hosts files &quot;hosts&quot; and &quot;default.hosts&quot; take effect with the setting option &quot;use hosts&quot;.
hosts The enhanced file &quot;hosts&quot; defines IP addresses/attributes for domains. Each line has the following format:
[[IP address][attributes]][single space][domain name]
where &quot;[[IP address][attributes]]&quot; could be:
ipv4 address such as:
172.67.157.211 torapp.eu.org
ipv6 address, Ex.:
[2606:4700:3037::6815:8c3] torapp.eu.org
empty, that would lift all server-imposed limitations. Ex.:
[single space]gitee.com
which will make all git repositories on the domain visitable as websites with raw file access url.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>JS/CSS/HTML/preprocessing for domains</title>
|
||||
<link>/en/sitejs/</link>
|
||||
<pubDate>Sat, 28 Jan 2023 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 &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. 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. Long press the button &quot;settings&quot;, check the option &quot;Run user scripts&quot;.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Bookmarks</title>
|
||||
<link>/en/bookmark/</link>
|
||||
<pubDate>Mon, 16 Jan 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/bookmark/</guid>
|
||||
<description>AI, chatgpt etc.
google gemini jeeves morphic komo iaskAI poe freegpt teach-anything magickpen note.ms
rentry
Wait for url from other devices
berify: reverse image search for video
Associated bookmarks Search engine files 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.
&quot;help_en.html&quot; bookmark associates with the user manual in English. Similarly, &quot;help_zh.html&quot; is for Chinese manual.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Tips</title>
|
||||
<link>/en/tips/</link>
|
||||
<pubDate>Mon, 16 Jan 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tips/</guid>
|
||||
<description>Text processing for clipboard data:
On home screen, pressing the sharing button of the bottom toolbar popups the text processing menu for clipboard data.
To show web pages in desktop mode:
PC button + option &quot;wide viewport&quot; + global js &quot;force page resizable&quot;.
Playing audio when screen off
Option &quot;Floating video&quot; + video fullscreen playing
Multiple home screens and Next/Prev page:
home5.html, home6.mht(or .search or .html), home7.mht(or .search or .html), .</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Address bar command line</title>
|
||||
<link>/en/acmd/</link>
|
||||
<pubDate>Sun, 08 Jan 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/acmd/</guid>
|
||||
<description>&quot;:!&quot; ( or &quot;!&quot;) command line Pressing &quot;:&quot; or &quot;!&quot; with hardware keyboard sets focus on the address bar.
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.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Any url as website</title>
|
||||
<link>/en/url2site/</link>
|
||||
<pubDate>Sun, 30 Oct 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/url2site/</guid>
|
||||
<description>The uweb internal link &quot;i:0m&quot; make any url such as download or indirect links visitable as a website. The second part of mirrors has examples using the following tricks:
&quot;i:0m04:[url]&quot;: to treat the [url] content as html with bookmarklet. &quot;i:0m?:[url]&quot;: to treat the [url] content as html, handling css/js properly. &quot;i:0m?[postfix]:[url]&quot;: auto append query postfix to url to retrieve content. &quot;i:0mi:5h:[url]&quot;: similar to &quot;i:0m?:[url]&quot;, to treat the [url] content as html (for download or no-script links etc.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Html5 applications</title>
|
||||
<link>/en/html5/</link>
|
||||
<pubDate>Sun, 02 Oct 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/html5/</guid>
|
||||
<description>This page is for uweb browser.
Click to install the following html5 apps:
Huge markdown file viewer
Huge markdown+katex file viewer (Tex formulas)
Huge markdeep file viewer (markdown, latex, diagram,graphviz etc.)
plyr video player
dplayer video player
pdf viewer
epub reader (author:llili)
djvu viewer
The corresponding menus can be installed with url services.
Features The following mentioned subfolders locate in the configuration folder.
The following html5 applications are allowed to read local files referred by &quot;https://local/sdcard/.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Configuration folders/files</title>
|
||||
<link>/en/filenames/</link>
|
||||
<pubDate>Thu, 30 Jun 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/filenames/</guid>
|
||||
<description>All folders end with character &quot;/&quot; and others are files. All folders/files locate in &quot;/data/data/info.torapp.uweb/files&quot;:
|
||||
&quot;css/&quot;: global css folder
|
||||
&quot;js/&quot;: global script folder
|
||||
&quot;sitejs/&quot;: script folder for domains
|
||||
&quot;sitecss/&quot;:CSS folder for domains
|
||||
&quot;bookmarklet/&quot;:bookmarklets, long pressing the &quot;JS&quot; button to execute.
|
||||
&quot;offline/&quot;: to save offline pages
|
||||
&quot;sbookmark/&quot;: to save super bookmarks
|
||||
&quot;sitecache/&quot;:offline cache
|
||||
&quot;longclick/&quot;: menus to appear when long-pressing hypertext (js files)
|
||||
&quot;icon/&quot;:customized icons
|
||||
&quot;app[XXX]/&quot;:html5 applications
|
||||
&quot;default.longclick&quot;: to configure menus when long-pressing hypertext.</description>
|
||||
<description>All folders end with character &quot;/&quot; and others are files. All folders/files locate in &quot;/data/data/info.torapp.uweb/files&quot;:
&quot;css/&quot;: global css folder
&quot;js/&quot;: global script folder
&quot;sitejs/&quot;: script folder for domains
&quot;sitecss/&quot;:CSS folder for domains
&quot;bookmarklet/&quot;:bookmarklets, long pressing the &quot;JS&quot; button to execute.
&quot;offline/&quot;: to save offline pages
&quot;sbookmark/&quot;: to save super bookmarks
&quot;sitecache/&quot;:offline cache
&quot;longclick/&quot;: menus to appear when long-pressing hypertext (js files)
&quot;icon/&quot;:customized icons
&quot;app[XXX]/&quot;:html5 applications
&quot;default.longclick&quot;: to configure menus when long-pressing hypertext.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Links</title>
|
||||
<link>/en/links/</link>
|
||||
<pubDate>Thu, 30 Jun 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/links/</guid>
|
||||
<description>Clicking the following hypertext will install menus for long pressing the bookmark button (with star as icon):
|
||||
Certificate info
|
||||
Web fullscreen
|
||||
Long pressing the bookmark button in uweb browser will popup menus defined in file &quot;default.link&quot;. The file format is as follows:
|
||||
[Menu name]:[url][space][javascript code]
|
||||
in which space and later parts are optional. url and later parts support &quot;%u&quot;,&quot;%s&quot; etc.. The javascript code will be executed after url is fully loaded.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>AD blocking</title>
|
||||
<link>/en/adblock/</link>
|
||||
<pubDate>Sat, 25 Jun 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/adblock/</guid>
|
||||
<description>Host blocking。
|
||||
Use bookmarklet &quot;list all script urls&quot; to generate url links, long pressing dubious script (usually 3rd-party library) link, click &quot;Block domain root&quot;. Javascript and CSS for domains。
|
||||
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)!</description>
|
||||
<description>Host blocking。
Use bookmarklet &quot;list all script urls&quot; to generate url links, long pressing dubious script (usually 3rd-party library) link, click &quot;Block domain root&quot;. Javascript and CSS for domains。
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)!</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Bookmarklets</title>
|
||||
<link>/en/bookmarklet/</link>
|
||||
<pubDate>Fri, 24 Jun 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/bookmarklet/</guid>
|
||||
<description>With a href=&quot;../index.html&quot;&gt;uweb browser, long pressing any bookmarklet link, click &quot;Open in new tab&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 &quot;GET&quot; method for &quot;POST&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>
|
||||
<description>With uweb browser, long pressing any bookmarklet link, click &quot;Open in new tab&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 &quot;GET&quot; method for &quot;POST&quot;
Shows all form elements
Enables all form elements
Toggle checkboxes
Check all checkboxes
Uncheck all checkboxes
Toggle all checkboxes in forms
Enable selection
Restore context menu</description>
|
||||
</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 &quot;link&quot;:
|
||||
google Translate
|
||||
bing translate
|
||||
deepL
|
||||
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:
|
||||
[Name]:[mimetype]:[command line]
|
||||
[mimetype] specifies input/output for [command line].
|
||||
It formats as &quot;[input mimetype]/[output mimetype]&quot;.
|
||||
[input mimetype] can be the following:
|
||||
&quot;html&quot;: rich text &quot;&quot; (empty): text &quot;.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>CSS样式</title>
|
||||
<title>CSS styles</title>
|
||||
<link>/en/globalcss/</link>
|
||||
<pubDate>Sun, 03 Apr 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/globalcss/</guid>
|
||||
<description>Uweb browser loads all &quot;.css&quot; files under the folder &quot;css&quot; as global css. Click the following links to install global css files:
|
||||
Clearing font settings
|
||||
The file &quot;night.css&quot; is used as night mode, click the following links to install one:
|
||||
webview 81+ night mode
|
||||
webview 80- night mode</description>
|
||||
<description>Uweb browser loads all &quot;.css&quot; files under the folder &quot;css&quot; as global css. Click the following links to install global css files:
Clearing font settings
The file &quot;night.css&quot; is used as night mode, click the following links to install one:
webview 81+ night mode
webview 80- night mode
Earliest loaded global js The &quot;.js&quot; files under the folder &quot;css&quot; are loaded as earlier as possible on the page.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Toolbar customization</title>
|
||||
<link>/en/icons/</link>
|
||||
<pubDate>Sun, 06 Feb 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/icons/</guid>
|
||||
<description>If subfolder &quot;icon&quot; exists, then files named as &quot;0&quot;,&quot;1&quot;,&quot;2&quot;...
|
||||
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,...
|
||||
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格式图标文件。</description>
|
||||
<description>If subfolder &quot;icon&quot; exists, then files named as &quot;0&quot;,&quot;1&quot;,&quot;2&quot;...
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,...
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.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Search engine files</title>
|
||||
<link>/en/searchcat/</link>
|
||||
<pubDate>Mon, 10 Jan 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/searchcat/</guid>
|
||||
<description>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;.
Any &quot;.search&quot; file can be opened as search engine file, each line of which has one of the following formats:
[Engine name]:[url without '%s' inside]
[Engine name]:[url with '%s' as keyword]
[Engine name]:POST:[post params with '%s' as keyword]:[url]
[Engine name]:[Extra request headers]:[post params with '%s' as keyword]:[url]</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Termux</title>
|
||||
<link>/en/termux/</link>
|
||||
<pubDate>Sat, 01 Jan 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/termux/</guid>
|
||||
<description>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.
Termux bookmarks Long pressing the following links then either &quot;commands&quot;-&gt;&quot;bookmark&quot; to add bookmarks or &quot;open in new tab&quot; to execute.
GNU bc (basic calculator)
bc with all extensions
Click the following links to install termux configurations: .</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>User agents</title>
|
||||
<link>/en/useragents/</link>
|
||||
<pubDate>Sat, 01 Jan 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/useragents/</guid>
|
||||
<description>Clicking the following links to add user agents with uweb browser or ebrowser.
Edge for android
Edge for windows</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Long pressed link menu</title>
|
||||
<link>/en/longclick/</link>
|
||||
<pubDate>Fri, 06 Nov 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/longclick/</guid>
|
||||
<description>To run commands Each line of file &quot;default.longclick&quot; has the following format: (same as default.cmds)
|
||||
[Name]:[mimetype]:[command line]
|
||||
in which [command line] can have &quot;%c&quot; (cookie), &quot;%u&quot; (current url), &quot;%t&quot; (title) etc.
|
||||
To visit url and load javascript file All &quot;.js&quot; files under the folder &quot;longclick&quot; are part of the popup menu.
|
||||
These javascript files are in the following format:
|
||||
The very first line can begin with &quot;//&quot; followed by website url that can have &quot;%u&quot; (current url), &quot;%t&quot; (title) etc.</description>
|
||||
<description>To run commands Each line of file &quot;default.longclick&quot; has the following format: (same as default.cmds)
[Name]:[mimetype]:[command line]
in which [command line] can have &quot;%c&quot; (cookie), &quot;%u&quot; (current url), &quot;%t&quot; (title) etc.
To visit url and load javascript file All &quot;.js&quot; files under the folder &quot;longclick&quot; are part of the popup menu.
These javascript files are in the following format:
The very first line can begin with &quot;//&quot; followed by website url that can have &quot;%u&quot; (current url), &quot;%t&quot; (title) etc.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Tools</title>
|
||||
<link>/en/tools/</link>
|
||||
<pubDate>Sun, 06 Sep 2020 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tools/</guid>
|
||||
<description>This page is for uweb browser.
install tdict_local (search with local indexes and remote content) Click to install the following local indexes with corresponding search engines (for test only).
install the indexes for &quot;American heritage dictionary (en-en&amp;zh with AHD/D.J./K.K. pronunciation)&quot;
Install AHD to home screen
Indexes for &quot;研究社新編英和活用大辞典(English usage: en-en&amp;ja)&quot;
Install &quot;English usage (en-en&amp;ja)&quot;
Indexes for SOED6
install SOED
The following dictionaries work better with markdown processor.
Install markdown processor</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Custom file handling</title>
|
||||
<link>/en/filecap/</link>
|
||||
<pubDate>Mon, 24 Aug 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/filecap/</guid>
|
||||
<description>Long press the settings button, check the option &quot;custom file handling&quot; to enable the functionality.
|
||||
The custom file handling configuration file is &quot;default.filecap&quot;, each line of it has the format as follows:
|
||||
[file extension]:[mimetype]:[command line]
|
||||
The &quot;[file extension]&quot; part can have at most two-segment of extensions such as &quot;txt.xz&quot;,&quot;html.gz&quot;.
|
||||
&quot;[mimetype]&quot; indicates the type of &quot;[command line]&quot; output.
|
||||
&quot;[command line]&quot; is same as the one in default.cmds. The most often used replacements are:</description>
|
||||
<description>Long press the settings button, check the option &quot;custom file handling&quot; to enable the functionality.
The custom file handling configuration file is &quot;default.filecap&quot;, each line of it has the format as follows:
[file extension]:[mimetype]:[command line]
The &quot;[file extension]&quot; part can have at most two-segment of extensions such as &quot;txt.xz&quot;,&quot;html.gz&quot;.
&quot;[mimetype]&quot; indicates the type of &quot;[command line]&quot; output.
&quot;[command line]&quot; is same as the one in default.cmds. The most often used replacements are:</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Blocking domain trees</title>
|
||||
<link>/en/adblock_domain/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/adblock_domain/</guid>
|
||||
<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 &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.
|
||||
Each line of the hosts file has the following format:</description>
|
||||
<title>Gestures</title>
|
||||
<link>/en/gesture/</link>
|
||||
<pubDate>Thu, 18 Jun 2020 00:00:00 +0000</pubDate>
|
||||
<guid>/en/gesture/</guid>
|
||||
<description>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.
Swipe left/right near the toolbar to switch window; fling left/right to switch to the last/first window.
Swiping on the top part of content window (near the top address bar by default) triggers corresponding link in the file &quot;default.</description>
|
||||
</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 &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. 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. Long press the button &quot;settings&quot;, check the option &quot;Run user scripts&quot;.</description>
|
||||
</item>
|
||||
|
||||
</channel>
|
||||
</rss>
|
||||
|
|
97
en/acmd/index.html
Normal file
97
en/acmd/index.html
Normal 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="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Address bar command line</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>
|
||||
|
||||
<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">":!" ( or "!") command line</h3>
|
||||
<p>Pressing ":" or "!" with hardware keyboard sets focus on the address bar.<br>
|
||||
The command line could be a ".js", ".sh" or other executable with arguments. Ex. ":!s g keyword" could invoke "s.js" executable with the whole string as arguments ("s.sh" or "s" if file exists, here "g" as google search engine); ":! g keyword" would invoke the file ".js" or ".sh" 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 ".js" (supporting search engine bundle)</a><br>
|
||||
<a href="i:0hs.sh:../searchurl/txt/web.sh">Install the example file "s.sh"</a></p>
|
||||
<p>Click the following links to make commands appear in address bar, then press "enter" 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 "default.acmd" 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 "refresh" 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 & 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 & 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">
|
||||
© 2018-2024 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>
|
|
@ -4,7 +4,7 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>AD blocking</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
|
@ -28,7 +28,7 @@
|
|||
</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 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>
|
||||
|
@ -49,13 +49,13 @@
|
|||
</ul>
|
||||
<ul>
|
||||
<li>
|
||||
<p><a href="../adblock_domain/index.html">Host blocking</a>。</p>
|
||||
<p><a href="../adblock_domain/index.html#">Host blocking</a>。</p>
|
||||
<ul>
|
||||
<li>Use <a href="../bookmarklet/index.html">bookmarklet "list all script urls"</a> to generate url links, long pressing dubious script (usually 3rd-party library) link, click "Block domain root".</li>
|
||||
<li>Use <a href="../bookmarklet/index.html#">bookmarklet "list all script urls"</a> to generate url links, long pressing dubious script (usually 3rd-party library) link, click "Block domain root".</li>
|
||||
</ul>
|
||||
</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>
|
||||
<li>Long press the button "js", click the menu "MarkAD mode". In "markAD mode", click page element to show all attributes and generate CSS AD blocking styles. By default, "display:none" is used. If "display" appears in the attribute information, recommend to use "transform:scale(0)!important" instead.</li>
|
||||
</ul>
|
||||
|
@ -68,7 +68,7 @@
|
|||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<p>Long press the setting button, check the option "Block external scripts". <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 "Block external scripts". <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>
|
||||
<p>Long press the button [☰], "Disable floating ADs", "Disable banners", "clear all timers", "stop events" and "Sleep ..." are also available.</p>
|
||||
|
@ -80,11 +80,40 @@
|
|||
<p>Click the button "JS" to disable javascript.</p>
|
||||
</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 "#" 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 "#" is for comments.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</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">
|
||||
© 2018-2024 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>
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
<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>Blocking domain trees</title>
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Hosts files</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
let href = location.href;
|
||||
|
@ -28,7 +28,7 @@
|
|||
</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 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>
|
||||
|
@ -40,21 +40,86 @@
|
|||
<br />
|
||||
|
||||
<div class="container">
|
||||
<h1 class="title">Blocking domain trees
|
||||
<h1 class="title">Hosts files
|
||||
<br>
|
||||
<span class="subtitle"></span>
|
||||
</h1>
|
||||
<ul class="tags">
|
||||
|
||||
<li><a href="../tags/adblock">adblock</a> </li>
|
||||
<li><a href="../tags/adblock/index.html#">adblock</a> </li>
|
||||
|
||||
</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 "yahoo.com" and "finance.yahoo.com". If the length of the last 2 segments is less than 7, such as "com.pl", then it is treated as one segment, so domains like "xxx.xxx.com.pl" are also valid in the hosts file.</p>
|
||||
<p>The enhanced hosts files "hosts" and "default.hosts" take effect with the setting option "use hosts".</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">"hosts"</a> defines IP addresses/attributes for domains. Each line has the following format:<br>
|
||||
[[IP address][attributes]][single space][domain name]</p>
|
||||
<p>where "[[IP address][attributes]]" 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 "mybing2.xn--xyza.top" 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 "uweb.torapp.eu.org" is just a proxy of "www.bing.com", and as such, the cookies of "www.bing.com" would be used for "uweb.torapp.eu.org".</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">"default.hosts"</a> blocks whole domain trees including all descendant domains. The domains in the hosts file must be 2 or 3 segment domains, such as "yahoo.com" and "finance.yahoo.com". If the length of the last 2 segments is less than 7, such as "com.pl", then it is treated as one segment, so domains like "xxx.xxx.com.pl" are also valid in the hosts file.</p>
|
||||
<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 "http(s)://"]<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>
|
||||
|
||||
</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">
|
||||
© 2018-2024 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>
|
||||
|
|
129
en/bookmark/index.html
Normal file
129
en/bookmark/index.html
Normal file
|
@ -0,0 +1,129 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Bookmarks</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">Bookmarks
|
||||
<br>
|
||||
<span class="subtitle"></span>
|
||||
</h1>
|
||||
<ul class="tags">
|
||||
|
||||
</ul>
|
||||
<p>AI, chatgpt etc.</p>
|
||||
<ul>
|
||||
<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://www.morphic.sh">morphic</a></li>
|
||||
<li><a href="https://komo.ai">komo</a></li>
|
||||
<li><a href="https://iask.ai">iaskAI</a></li>
|
||||
<li><a href="https://poe.com">poe</a></li>
|
||||
<li><a href="https://freegpt.cc">freegpt</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><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 ".html", which means the bookmark file if existing is appended to the page when the search engine file is on screen.</p>
|
||||
<p>"help_en.html" bookmark associates with the user manual in English. Similarly, "help_zh.html" 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>"home.css" (in current folder, parent folder or the "bookmark" folder) styles bookmarks, search engines and the folder itself. The file is in html format instead of CSS, so it needs "<style>" 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> "i:a1[url]?[post data]" sends http "POST" 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 => "open in new tab" to execute.</p>
|
||||
<p>To save the bookmarks to local, users firstly need to install "bookmark" menu by clicking corresponding link in the <a href="../urls/index.html#">url services</a> page, then long press the bookmark link => "open in new tab" => "Commands" => "bookmark" 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 "/sdcard/Download/uweb"</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="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 "/sdcard/Download/mdict" 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">"novel.html": auto reader's mode</a></p>
|
||||
<h3 id="science">Science</h3>
|
||||
<h4 id="physics">Physics</h4>
|
||||
<p><a href="https://www.feynmanlectures.caltech.edu/">Feynman lectures</a></p>
|
||||
<h4 id="chemistry">Chemistry</h4>
|
||||
<p><a href="https://www.chemspider.com">chemspider</a><br>
|
||||
<a href="http://bl.ocks.org/chemplexity/raw/180e960a6d9e68adf28429dd16f05fa0/">molecule SMILES</a><br>
|
||||
<a href="http://cdb.ics.uci.edu/cgibin/Smi2DepictWeb.py">SMILES2structure</a></p>
|
||||
|
||||
</div>
|
||||
<p>Last Modified: 19 July 2024<br>
|
||||
add search engines for cloud storages<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">
|
||||
© 2018-2024 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>
|
|
@ -4,7 +4,7 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Bookmarklets</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
|
@ -28,7 +28,7 @@
|
|||
</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 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>
|
||||
|
@ -46,10 +46,10 @@
|
|||
</h1>
|
||||
<ul class="tags">
|
||||
|
||||
<li><a href="../tags/javascript">javascript</a> </li>
|
||||
<li><a href="../tags/javascript/index.html#">javascript</a> </li>
|
||||
|
||||
</ul>
|
||||
<p>With a href="../index.html">uweb browser</a>, long pressing any bookmarklet link, click "Open in new tab", 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 "Open in new tab", 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 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>
|
||||
|
@ -71,6 +71,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>
|
||||
|
||||
</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">
|
||||
© 2018-2024 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>
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Categories on </title>
|
||||
<title>Categories on uweb browser: unlimited power</title>
|
||||
<link>/en/categories/</link>
|
||||
<description>Recent content in Categories on </description>
|
||||
<generator>Hugo -- gohugo.io</generator><atom:link href="/en/categories/index.xml" rel="self" type="application/rss+xml" />
|
||||
<description>Recent content in Categories on uweb browser: unlimited power</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<atom:link href="/en/categories/index.xml" rel="self" type="application/rss+xml" />
|
||||
</channel>
|
||||
</rss>
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
<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>Change log</title>
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Downloads</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
let href = location.href;
|
||||
|
@ -28,7 +28,7 @@
|
|||
</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 nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
|
||||
|
||||
<nav>
|
||||
</nav>
|
||||
|
@ -36,16 +36,90 @@
|
|||
<br />
|
||||
|
||||
<div class="container">
|
||||
<h1 class="title">Change log
|
||||
<h1 class="title">Downloads
|
||||
<br>
|
||||
<span class="subtitle"></span>
|
||||
</h1>
|
||||
<ul class="tags">
|
||||
|
||||
</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://galaxy.store/uweb">Galaxy.Store</a></p>
|
||||
<p><a href="https://s1.asytech.cn/s/tQrgT5kBRg8Trry">uweb, termux & history versions</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://my.powerfolder.com/getlink/fi61cC6VHjK72tfufmnLAz/">powerfolder</a></p>
|
||||
<p><a href="https://www.udrop.com/folder/08ba413230f465ca0901bef68e857c0b/uweb">udrop</a></p>
|
||||
<p><a href="https://releases.pagure.org/uwebapk/">pagure</a></p>
|
||||
<p><a href="http://pan.mcbebbs.cn/s/dJ4t8">mcbebbs</a></p>
|
||||
<h4 id="main-featuresreadmeindexhtml"><a href="../readme/index.html">Main features</a></h4>
|
||||
<h4 id="change-logs">Change logs</h4>
|
||||
<p>1048: enhance file downloading. Previous versions may fail for few sites.<br>
|
||||
1047: add huge markdown file viewer<br>
|
||||
1038: support chatBot as search engine with url "i:0/js/hash2textarea.js:https://XXX"<br>
|
||||
1036: TV mode: reuse "engine.search" as live TV channel urls.<br>
|
||||
1034: click share button on homescreen to process clipboard text.<br>
|
||||
1030: Allow downloading with global redirection<br>
|
||||
1026: Test automation: enable i:0 urls in scripting mode<br>
|
||||
1017: crontab alarm clock and <a href="../links/index.html">links</a> as sixth field.<br>
|
||||
1008: Add long screenshot mode<br>
|
||||
1006: Advanced configuration: auto reload, download path<br>
|
||||
1004: bookmarklet "Show as html" to support clipboard sites such as "netcut.cn".<br>
|
||||
998: <a href="../rjs/index.html">Bookmarklets</a> to support CSP sites.<br>
|
||||
991: <a href="../redirect/index.html">global url redirection</a> support.<br>
|
||||
988: <a href="../adblock_domain/index.html">hosts</a> file to support response headers.<br>
|
||||
985: <a href="../links/index.html">Special urls</a> to support shortcut keys such as ctrl-a to ctrl-z.<br>
|
||||
983: support <a href="../adblock_domain/index.html">"hosts"</a> file domain name resolving (no root needed), only single space allowed as separator for ip address and domain name.<br>
|
||||
975: <a href="../bookmark/index.html">Bookmarks</a> to support styling for markdown etc.<br>
|
||||
971: <a href="../links/index.html">multiple type profiles</a>: switch any data including website logins, user configurations orthogonally.<br>
|
||||
964: site source html preprocessing before rendering with user <a href="../sitejs/index.html">site extra html</a>.<br>
|
||||
961: webdav/http file upload support with <a href="../links/index.html">"i:0u" links</a>.<br>
|
||||
955: Address bar: <a href="../acmd/index.html">":!" or "!"</a> for command line support (.js/.sh files as executables).<br>
|
||||
949: Address bar: ":p [width in milliInch]x[height]" to generate PDF in custom size<br>
|
||||
946: Option "use offline cache" to support serverless local websites.</p>
|
||||
<p>945: commands to support evaluation of generated js code.</p>
|
||||
<p>943: Multiple home screens support .mht (offline webpage), .search & .html local files.</p>
|
||||
<p>940: <a href="../url2site/index.html">Any urls as website</a> with local html processing (<a href="../links/index.html">"i:0m/..../xxx.html:url"</a>)</p>
|
||||
<p>935:</p>
|
||||
<ul>
|
||||
<li>Pipe support: command line output to uweb tabs.</li>
|
||||
</ul>
|
||||
<p>934:</p>
|
||||
<ul>
|
||||
<li>Serverless local sites: PWA-kind web extension (chrome .crx & firefox .xpi) support.</li>
|
||||
<li>PWAs and web extensions to be used as search engines, ex. kiwix zim as search engines.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<p>Last Modified: 5 May 2024<br>
|
||||
enhance downloading<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">
|
||||
© 2018-2024 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>
|
||||
|
|
143
en/cmds/index.html
Normal file
143
en/cmds/index.html
Normal file
|
@ -0,0 +1,143 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Commands</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">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 "default.cmds" examples:</p>
|
||||
<p><a href="i:03Clear data::toybox find /data/data/info.torapp.uweb/app_webview ! -name 'Cookies' ! -name '*.cjar' -type f -delete">Clear data::toybox find /data/data/info.torapp.uweb/app_webview ! -name 'Cookies' ! -name '*.cjar' -type f -delete</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>a.tmp;mv a.tmp default.autoc;>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 > 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::toybox tar -xzf %f -C /">tgz install::toybox tar -xzf %f -C /</a></p>
|
||||
<p>Users should change the IP addresses in the following menus accordingly. In all cases, TV side needs to execute "<a href="../links/index.html#">wait for network msg</a>" first. Send message to network (ex. for android TVs):<br>
|
||||
<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>/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>/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>/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>/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.2.120 'DISPLAY=:0 xsel -i'">Clipboard2PC:clip:ssh fengcao@192.168.2.120 'DISPLAY=:0 xsel -i'</a></p>
|
||||
<p><a href="i:03ClipboardFromPC:/clip:ssh fengcao@192.168.2.120 'DISPLAY=:0 xsel -o'">ClipboardFromPC:/clip:ssh fengcao@192.168.2.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 socat(apt 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">".cmds" file format</h4>
|
||||
<p>Each line has the following format:<br>
|
||||
[Name]:[mimetype]:[command line]</p>
|
||||
<p>[command line] can have "%c" (cookie), "%s" (address bar text), "%u" (url), "%t" (title).<br>
|
||||
[mimetype] have the following formats:</p>
|
||||
<ul>
|
||||
<li>regular mimetype such as "text/html" to indicate the content type of the command output. Ex. "text/javascript" makes browser to evaluate the js code.</li>
|
||||
<li>"clip/clip" to indicate "clipboard" as input and the command output is copied to clipboard.</li>
|
||||
<li>"/clip": copy the command output to clipboard.</li>
|
||||
<li>"clip/text/html" : clipboard as input, and the command output is processed as "text/html".</li>
|
||||
<li>"termux/*": command line is executed under termux.</li>
|
||||
<li>"/uweb": the command output is processed as <a href="../links/index.html#">links</a>.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<p>Last Modified: 2 April 2024<br>
|
||||
add ending # to /index.html<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">
|
||||
© 2018-2024 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>
|
15
en/download.md
Normal file
15
en/download.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
**Download links**
|
||||
|
||||
[uweb, termux & history versions](https://s1.asytech.cn/s/tQrgT5kBRg8Trry)
|
||||
|
||||
[github](https://github.com/torappinfo/uweb/releases/tag/v1)
|
||||
|
||||
[sourceforge](https://sourceforge.net/projects/uwebbrowser/files/v1/)
|
||||
|
||||
[udrop](https://www.udrop.com/folder/08ba413230f465ca0901bef68e857c0b/uweb)
|
||||
|
||||
[powerfolder](https://my.powerfolder.com/getlink/fi61cC6VHjK72tfufmnLAz/)
|
||||
|
||||
[pagure](https://releases.pagure.org/uwebapk/)
|
||||
|
||||
[mcbebbs](http://pan.mcbebbs.cn/s/dJ4t8)
|
80
en/ebrowser/eb_select/index.html
Normal file
80
en/ebrowser/eb_select/index.html
Normal file
|
@ -0,0 +1,80 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../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>
|
||||
|
||||
<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">
|
||||
© 2018-2024 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
8
en/ebrowser/index.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<body>
|
||||
<ul>
|
||||
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
19
en/ebrowser/index.xml
Normal file
19
en/ebrowser/index.xml
Normal 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>/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="/en/ebrowser/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Text selection</title>
|
||||
<link>/en/ebrowser/eb_select/</link>
|
||||
<pubDate>Fri, 12 Jul 2024 00:00:00 +0000</pubDate>
|
||||
<guid>/en/ebrowser/eb_select/</guid>
|
||||
<description>Click the following links to install context menus for text selection.</description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
234
en/ebrowserreadme/index.html
Normal file
234
en/ebrowserreadme/index.html
Normal file
|
@ -0,0 +1,234 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title></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>
|
||||
|
||||
<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="ebrowserhttpsgithubcomtorappinfoebrowser-keyboard-friendly-minimal-suckless-web-browser"><a href="https://github.com/torappinfo/ebrowser">Ebrowser</a>: keyboard-friendly minimal suckless web browser</h3>
|
||||
<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 "md" 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>
|
||||
</ul>
|
||||
<p>Note: Usually electron apps are heavyweight as they use browsers for simple things. Ebrowser uses core chromium effectively and very lightweight. Recommend to install electron separately.</p>
|
||||
<h4 id="installing-for-windows-macos-and-linux">Installing (for Windows, MacOS and Linux)</h4>
|
||||
<h5 id="install-with-prebuilt-binaries">Install with prebuilt binaries</h5>
|
||||
<p>You can find prebuilt binaries <a href="https://github.com/torappinfo/ebrowser/releases">here</a>.</p>
|
||||
<h5 id="install-with-nodejs">Install with nodejs</h5>
|
||||
<pre><code>npm install electron
|
||||
npm install ebrowser
|
||||
</code></pre>
|
||||
<p>Run ebrowser</p>
|
||||
<pre><code>electron ~/node_modules/ebrowser
|
||||
</code></pre>
|
||||
<p>Later on, you can run "npm install electron" to update electron/chromium or "npm install ebrowser" to update ebrowser independently.</p>
|
||||
<h5 id="update-app-quickly-without-updating-chromium">Update app quickly without updating chromium</h5>
|
||||
<p>Pressing "Alt" to show the menu bar and choose "Check for updates" under "Help". OR</p>
|
||||
<p>Type ":update" in the address bar and press "enter" key to update.</p>
|
||||
<p>Mirror urls could be used like ":update https://uwebzh.netlify.app/misc/ebrowser". All the mirrors listed on <a href="https://uwebzh.netlify.app/en/readme/index.html">uweb browser</a> could be used. The update url needs to be changed accordingly to be the folder "misc/ebrowser" under the mirror site root url.</p>
|
||||
<h4 id="key-shortcuts">Key shortcuts</h4>
|
||||
<ul>
|
||||
<li>Alt: show menu</li>
|
||||
<li>ALT+<-: go backward</li>
|
||||
<li>ALT+->: 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 ("gredirect.json")</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>
|
||||
<h4 id="address-bar-commands">Address bar commands</h4>
|
||||
<p>Like any popular browser, the very first word in address bar if defined in "search.json" identifies a search engine. Moreover, the address bar serves as command line interface:</p>
|
||||
<ul>
|
||||
<li>"/" for find-in-page</li>
|
||||
<li>":" for address bar commands
|
||||
<ul>
|
||||
<li>ac [bookmark/history path w/o ext] : load ".rec" 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]: 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>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: "javascript:..." is special url and thus works in the current web page, while ":js ..." 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 "redirect.json" 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]. ":up" command also disables global and domain redirections, which are not restored by ":np".</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 "{}" to capture long screenshot as vector graphics.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>"!" address bar commands<br>
|
||||
"!xx ..." evaluates "xx.js" with the whole text as arguments[0].</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>"i:0/js/xxx.js:[url]" loads the "[url]" with bookmarklet "js/xxx.js".</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 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)</h4>
|
||||
<p>Pressing "ESC" to enter no-focus mode if not sure.</p>
|
||||
<ul>
|
||||
<li>":" for address bar commands</li>
|
||||
<li>"/" for find-in-page with address bar</li>
|
||||
<li>"!" for "!" address bar commands</li>
|
||||
</ul>
|
||||
<p>The other commands are defined in "mapkeys.json", which will map keys to address bar commands.</p>
|
||||
<h4 id="configuration-files">Configuration files</h4>
|
||||
<ul>
|
||||
<li>"config": lines of address bar commands.</li>
|
||||
<li>"search.json": <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 "%s" would be replaced by search query.</li>
|
||||
<li>"default.autoc": predefined strings for address bar auto completion.</li>
|
||||
<li>"gredirect.json": global redirection urls as array of urls</li>
|
||||
<li>"redirect.json": domain-replacementDomain pairs, default to be applied.</li>
|
||||
<li>"mapkeys.json": keys-addressbarCommands pairs. The addressbar commands are multiple lines of address bar command separated by "\n".</li>
|
||||
<li>"proxy.json": name-<a href="https://www.electronjs.org/docs/latest/api/structures/proxy-config">ProxyConfig</a> pairs</li>
|
||||
<li>"uas.json" : 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>"menu.json": 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 "%u" as the downloaded url.</li>
|
||||
<li>"select.json": to define menus for text selections. The odd-indexed strings are address bar commands with "%s" as the text selection.</li>
|
||||
<li>"download.json" : 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 "%u" as the downloaded url.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 id="javascript-at-three-levels">Javascript at three levels</h4>
|
||||
<ul>
|
||||
<li>Web page: url like "javascript:" or bookmarklet command ":bml" runs in web page.</li>
|
||||
<li>Browser (or renderer process) :
|
||||
<ul>
|
||||
<li>":bjs" to execute the following js code at browser level.</li>
|
||||
<li>"!xx" evaluates "xx.js", which could manipulate address bar etc.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>OS level (or main process) : ":js" to execute the following js code with all OS APIs available.</li>
|
||||
</ul>
|
||||
<h5 id="examples-for-jsbjs-commands">examples for ":js"/":bjs" commands</h5>
|
||||
<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>
|
||||
<h4 id="new-usages">New usages</h4>
|
||||
<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 ":Pdf {}" to export vector graphics.</li>
|
||||
<li>Use imageMagick to convert to any other vector graphics format.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 id="license">License</h4>
|
||||
<p>You can copy or modify the code/program under the terms of the GPL3.0 or later versions.</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">
|
||||
© 2018-2024 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>
|
|
@ -4,7 +4,7 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Custom file handling</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
|
@ -28,7 +28,7 @@
|
|||
</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 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>
|
||||
|
@ -46,9 +46,9 @@
|
|||
</h1>
|
||||
<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>
|
||||
<p>Long press the settings button, check the option "custom file handling" to enable the functionality.</p>
|
||||
|
@ -56,7 +56,7 @@
|
|||
[file extension]:[mimetype]:[command line]</p>
|
||||
<p>The "[file extension]" part can have at most two-segment of extensions such as "txt.xz","html.gz".<br>
|
||||
"[mimetype]" indicates the type of "[command line]" output.<br>
|
||||
"[command line]" is same as the one in <a href="../searchurl/cmds.html">default.cmds</a>. The most often used replacements are:<br>
|
||||
"[command line]" 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>
|
||||
<p>default.filecap example:</p>
|
||||
<pre><code>txt:text/html:curl %p "%u"
|
||||
|
@ -72,12 +72,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
|
||||
pptx:uweb:echo http://docs.google.com/gview?embedded=true&url=%U
|
||||
xz:text/plain:curl %p "%u"|xz -d --</code></pre>
|
||||
<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
|
||||
djvu:uweb:echo file:///data/data/info.torinfo.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>
|
||||
<p>Examples for <a href="../html5/index.html#">html5 application</a>:</p>
|
||||
<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.torapp.uweb/files/app/djvu.html?url=%u
|
||||
epub:uweb:echo file:///data/data/info.torapp.uweb/files/app/reader/index.html#?bookPath==%u</code></pre>
|
||||
|
||||
</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">
|
||||
© 2018-2024 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>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Configuration folders/files</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
|
@ -28,7 +28,7 @@
|
|||
</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 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>
|
||||
|
@ -48,58 +48,89 @@
|
|||
|
||||
</ul>
|
||||
<p>All folders end with character "/" and others are files. All folders/files locate in "/data/data/info.torapp.uweb/files":<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/css/">css/</a>": <a href="../globalcss/index.html">global css folder</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/js/">js/</a>": global script folder<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/sitejs/">sitejs/</a>": <a href="../sitejs/index.html">script folder for domains</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/sitecss/">sitecss/</a>":<a href="../sitejs/index.html">CSS folder for domains</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/bookmarklet/">bookmarklet/</a>":bookmarklets, long pressing the "JS" button to execute.<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/offline/">offline/</a>": to save offline pages<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/sbookmark/">sbookmark/</a>": to save super bookmarks<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/sitecache/">sitecache/</a>":<a href="../offlinecache/index.html">offline cache</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/longclick/">longclick/</a>": menus to appear when long-pressing hypertext (js files)<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/icon/">icon/</a>":<a href="../icons/index.html">customized icons</a><br>
|
||||
"app[XXX]/":<a href="../html5/index.html">html5 applications</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.longclick">default.longclick</a>": to configure menus when long-pressing hypertext.<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.uas">default.uas</a>":<a href="../searchurl/uas.html">user agents</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.urls">default.urls</a>":<a href="../searchurl/urls.html">service urls</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.acmd">default.acmd</a>":<a href="../gnuplot/index.html">configure address bar functionalities</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.hosts">default.hosts</a>":<a href="../adblock_hosts/index.html">hosts not allowed to visit</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.redirect">default.redirect</a>":<a href="../redirect/index.html">redirect websites</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.cmds">default.cmds</a>":<a href="../searchurl/cmds.html">commands</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.link">default.link</a>":<a href="../links/index.html">links</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.rjs">default.rjs</a>":<a href="../rjs/index.html">Remote javascript</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.select">default.select</a>":<a href="../pccopy/index.html">menus for selected text</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.input">default.input</a>": common phrases for user inputs<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.gesture">default.gesture</a>": 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>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.gesture2">default.gesture2</a>": gestures on the right side similar to default.gesture.<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.button">default.button</a>": 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>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.button2">default.button2</a>": similar to default.button but for long-pressed buttons.<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.filecap">default.filecap</a>":<a href="../filecap/index.html">custom file handling</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.rc">default.rc</a>": check the option "custom file handling" to execute the shell script file during uweb launching. <a href="../tools/index.html">tcron</a> provides extra cron tools.<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.rc2">default.rc2</a>": check the option "custom file handling" to execute the shell script file when uweb returns to foreground.<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/engine.search">engine.search</a>": 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 "%s" as search keywords.<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.siteconf">default.siteconf</a>": 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>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.playrate">default.playrate</a>": 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 ".5x:", at least one such menu is required. All other menus must be put after playing ratio menus.<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.autoc">default.autoc</a>": address bar autocomplete candidate strings.<br>
|
||||
"query.autoc": home screen search autocomplete candidate strings.<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/home5.html">home5.html</a>": user defined home screen. home6.html, home6.search, home7.html ... multiple home screen (pressing right arrow button to visit). ".html" files have priority over ".search" files. home4.html, home4.search, home3.html ... (long pressing left arrow button to access).<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/home5.search">home5.search</a>":<a href="../searchurl/search.html">search engines</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/home.css">home.css</a>": <a href="../searchurl/homescreen.html">home screen styles</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/bookmark.html">bookmark.html</a>": bookmarks<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/quickstart.html">quickstart.html</a>": <a href="../searchurl/quickstart.html">quick start</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/colors.txt">colors.txt</a>": background colors<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/default.css">default.css</a>": <a href="../sitejs/index.html">default CSS style for domains not defined in sitejs folder</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/night.css">night.css</a>": <a href="../globalcss/index.html">Night mode</a><br>
|
||||
"bookmarklet/videoplayer.js": <a href="../video/index.html">fullscreen video player</a><br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/types.sniff">types.sniff</a>": file types for resource sniffer<br>
|
||||
"js.allow": 3rd-party resource white list. One domain per line.<br>
|
||||
"url.deny": one giant regular expression for blocked urls (java grammar). "#" to comment and carriage return (CR or new line) is ignored.<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/sniff.log">sniff.log</a>": resource sniffing result<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/history.rec">history.rec</a>": visiting history<br>
|
||||
"<a href="file:///data/data/info.torinfo.uweb/files/query.rec">query.rec</a>": query history</p>
|
||||
<p>"shortcut/": dynamical shortcut, if not exist, then default to "bookmark".</p>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/css/">css/</a>": <a href="../globalcss/index.html#">global css folder</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/js/">js/</a>": global script folder<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/sitejs/">sitejs/</a>": <a href="../sitejs/index.html#">script folder for domains</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/sitecss/">sitecss/</a>":<a href="../sitejs/index.html#">CSS folder for domains</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/bookmarklet/">bookmarklet/</a>":bookmarklets, long pressing the "JS" button to execute.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/offline/">offline/</a>": to save offline pages<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/sbookmark/">sbookmark/</a>": to save super bookmarks<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/sitecache/">sitecache/</a>":<a href="../offlinecache/index.html#">offline cache</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/longclick/">longclick/</a>": menus to appear when long-pressing hypertext (js files)<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/icon/">icon/</a>":<a href="../icons/index.html#">customized icons</a><br>
|
||||
"app[XXX]/":<a href="../html5/index.html#">html5 applications</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.longclick">default.longclick</a>": to configure menus when long-pressing hypertext.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.uas">default.uas</a>":<a href="../searchurl/uas.html">user agents</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.urls">default.urls</a>":<a href="../urls/index.html#">service urls</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.acmd">default.acmd</a>":<a href="../gnuplot/index.html#">configure address bar functionalities</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/hosts">hosts</a>": 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>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.hosts">default.hosts</a>":<a href="../adblock_hosts/index.html#">hosts not allowed to visit</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.redirect">default.redirect</a>":<a href="../redirect/index.html#">redirect websites</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.cmds">default.cmds</a>":<a href="../cmds/index.html#">commands</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.link">default.link</a>":<a href="../links/index.html#">links</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.rjs">default.rjs</a>":<a href="../rjs/index.html#">Remote javascript</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.select">default.select</a>":<a href="../textprocess/index.html#">menus for selected text</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.input">default.input</a>": common phrases for user inputs<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.gesture">default.gesture</a>": 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>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.gesture2">default.gesture2</a>": gestures on the right side similar to default.gesture.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.button">default.button</a>": 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>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.button2">default.button2</a>": similar to default.button but for long-pressed buttons.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.filecap">default.filecap</a>":<a href="../filecap/index.html#">custom file handling</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.rc">default.rc</a>": check the option "custom file handling" to execute the shell script file during uweb launching. <a href="../tools/index.html#">tcron</a> provides extra cron tools.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.rc2">default.rc2</a>": check the option "custom file handling" to execute the shell script file when uweb returns to foreground.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/crontab">crontab</a>":<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/engine.search">engine.search</a>": 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 "%s" as search keywords. If the search engine urls in "engine.search" are video urls (without %s inside), the file will make uweb browser optimized for TV watching with remote control.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.siteconf">default.siteconf</a>": 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>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.playrate">default.playrate</a>": 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 ".5x:", at least one such menu is required. All other menus must be put after playing ratio menus.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.autoc">default.autoc</a>": address bar autocomplete candidate strings.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/query.autoc">query.autoc</a>": home screen search autocomplete candidate strings.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/home5.html">home5.html</a>": 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>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/home5.search">home5.search</a>":<a href="../search/index.html#">search engines</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/home.css">home.css</a>": <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 "<style>" elements. Each "home.css" file is responsible for the current folder and its subfolders.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/bookmark.html">bookmark.html</a>": bookmarks<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/quickstart.html">quickstart.html</a>": <a href="../searchurl/quickstart.html">quick start</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/colors.txt">colors.txt</a>": background colors<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/default.css">default.css</a>": <a href="../sitejs/index.html#">default CSS style for domains not defined in sitejs folder</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/night.css">night.css</a>": <a href="../globalcss/index.html#">Night mode</a><br>
|
||||
"bookmarklet/videoplayer.js": <a href="../video/index.html#">fullscreen video player</a><br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/types.sniff">types.sniff</a>": file types for resource sniffer<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/js.allow">js.allow</a>": 3rd-party resource white list. One domain per line.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/url.deny">url.deny</a>": one giant regular expression for blocked urls (java grammar). "#" to comment and carriage return (CR or new line) is ignored.<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/sniff.log">sniff.log</a>": resource sniffing result<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/history.rec">history.rec</a>": visiting history<br>
|
||||
"<a href="file:///data/data/info.torapp.uweb/files/query.rec">query.rec</a>": query history</p>
|
||||
<p>"<a href="file:///data/data/info.torapp.uweb/files/shortcut/">shortcut/</a>": dynamical shortcut, if not exist, then default to "bookmark".</p>
|
||||
|
||||
</div>
|
||||
<p>Last Modified: 30 April 2024<br>
|
||||
urlInc() prefers .search to .html<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">
|
||||
© 2018-2024 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>
|
||||
|
|
99
en/gesture/index.html
Normal file
99
en/gesture/index.html
Normal file
|
@ -0,0 +1,99 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Gestures</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">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 "swipe to hide tools"; 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 "default.gesture", 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 "default.gesture" 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 "s" and "e" are the above defined numbers for the gesture start point and end point. Let "linenumber = 3*s+e" , 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 "10" each time.</li>
|
||||
</ul>
|
||||
<p>The final line number will match the corresponding line in "default.gesture", 0 to the first line, ...</p>
|
||||
<p>"default.gesture2" is for the right side gesturs and the algorithm is similar to "default.gesture".</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">
|
||||
© 2018-2024 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>
|
|
@ -4,8 +4,8 @@
|
|||
<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>CSS样式</title>
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>CSS styles</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
let href = location.href;
|
||||
|
@ -28,7 +28,7 @@
|
|||
</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 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>
|
||||
|
@ -40,20 +40,51 @@
|
|||
<br />
|
||||
|
||||
<div class="container">
|
||||
<h1 class="title">CSS样式
|
||||
<h1 class="title">CSS styles
|
||||
<br>
|
||||
<span class="subtitle"></span>
|
||||
</h1>
|
||||
<ul class="tags">
|
||||
|
||||
</ul>
|
||||
<p><a href="../index.html">Uweb browser</a> loads all ".css" files under the folder "css" 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="../index.html#">Uweb browser</a> loads all ".css" files under the folder "css" as global css. Click the following links to install global css files:</p>
|
||||
<p><a href="i:0hcss/clearfont.css:../../zh/searchurl/txt/clearfont.css">Clearing font settings</a></p>
|
||||
<p>The file "night.css" 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: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.css">webview 81+ night mode</a><br>
|
||||
<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 ".js" files under the folder "css" are loaded as earlier as possible on the page.</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">
|
||||
© 2018-2024 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>
|
||||
|
|
143
en/html5/index.html
Normal file
143
en/html5/index.html
Normal file
|
@ -0,0 +1,143 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Html5 applications</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">Html5 applications
|
||||
<br>
|
||||
<span class="subtitle"></span>
|
||||
</h1>
|
||||
<ul class="tags">
|
||||
|
||||
</ul>
|
||||
<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 (author:llili)</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 "https://local/sdcard/..." where the "/sdcard/.." part is the full path of the file. 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 "app" (such as "appPDF")</li>
|
||||
<li>"https://local/..." applications (only possible with the option "<a href="../offlinecache/index.html#">use offline resources</a>" and installed under the folder "sitecache/local/")</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<p><span style="color:red">All files under the subfolder "app" 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 "?app=[html5 app url]" to the file urls.</span> Ex. "file:///..../xx.md?app=https://...../app.html" loads "app.html" first, then "app.html" 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 "app" 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 "custom file handling":<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]&[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]&[length]</li>
|
||||
</ul>
|
||||
<p>Ex. "#offset=10000&500" 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 "app" (optional)</h4>
|
||||
<p>By default, the subfolder "app" is created by clicking to install any of above html5 applications.</p>
|
||||
<p>To make file management easier, users can symbolic link the subfolder "app" to any other locations as long as it is readable.</p>
|
||||
<p>One way to configure "app" 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 "app" to be locations other than "/sdcard/Download/app", modify as you like.</li>
|
||||
<li>Press "enter" 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 "/.../xxx.mdx,xxx.mdd" 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 "app" subfolder under the configuration folder. In above example, the files "xxx.mdx" and "xxx.mdd" locate in the folder ".../app/mdict".</p>
|
||||
<p>To make life easier, users can <a href="../acmd/index.html#">link the "app" 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: 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">
|
||||
© 2018-2024 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>
|
|
@ -4,7 +4,7 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Toolbar customization</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
|
@ -28,7 +28,7 @@
|
|||
</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 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>
|
||||
|
@ -49,11 +49,39 @@
|
|||
</ul>
|
||||
<p>If subfolder "icon" exists, then files named as "0","1","2"...<br>
|
||||
are used for icons in the bottom toolbar. file "0" to replace the left arrow button, "1" for right arrow button, "2" for the setting button,"3" for the home screen button,...</p>
|
||||
<p>If a new button is defined (file name "20" exists), uweb also supports VectorDrawable with "android compiled XML" format. All icon files must be all VectorDrawables or 此时所有图标文件必须都是compiled XML格式,或都是普通的图像格式(png,jpg,gif等)。用户可将VectorDrawable XML文件放到安卓项目目录assets下面,重新生成apk文件以后将apk文件解压即可得compiled XML格式图标文件。</p>
|
||||
<p>用户可定义任意多个按钮(100个按钮毫无压力),其短按长按功能可在文件default.button及default.button2中定义,格式与文件<a href="../links">default.link</a>完全相同,每行从最后一个按钮开始重定义功能。</p>
|
||||
<p>注意:刷新按钮及窗口按钮图标暂时不能重定义。</p>
|
||||
<p>If a new button is defined (file name "20" exists), uweb also supports VectorDrawable with "android compiled XML" format. All icon files must be either all compiled VectorDrawables or common image formats.</p>
|
||||
<p>Note: The refresh and tab manager button can not be redefined.</p>
|
||||
|
||||
</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">
|
||||
© 2018-2024 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>
|
||||
|
|
202
en/index.html
202
en/index.html
|
@ -1,12 +1,13 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta name="generator" content="Hugo 0.101.0" />
|
||||
<meta name="generator" content="Hugo 0.131.0">
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="alternate" type="application/rss+xml" href="../en/index.xml" title="uweb browser: unlimited power">
|
||||
|
||||
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" />
|
||||
<title></title>
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>uweb browser: unlimited power</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
let href = location.href;
|
||||
|
@ -29,7 +30,7 @@
|
|||
</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 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>
|
||||
|
@ -44,115 +45,218 @@
|
|||
<ul class="posts">
|
||||
|
||||
<li class="post">
|
||||
<a href="https://s1.asytech.cn/s/tQrgT5kBRg8Trry">
|
||||
<span>Download the uweb browser</span>
|
||||
<a href="readme/index.html#">
|
||||
<span>About uweb browser</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
<li class="post">
|
||||
<a href="searchurl/search.html">
|
||||
<a href="search/index.html#">
|
||||
<span>Search engines</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="searchurl/urls.html">
|
||||
<a href="changelog/index.html#">
|
||||
<span>Downloads</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="sitemap/index.html#">
|
||||
<span>Configuration</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="urls/index.html#">
|
||||
<span>Url services</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
<li class="post">
|
||||
<a href="sitemap/index.html">
|
||||
<span>Site map</span>
|
||||
<a href="cmds/index.html#">
|
||||
<span>Commands</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="filenames/index.html">
|
||||
<span>Configuration folders/files</span>
|
||||
<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="textprocess/index.html#">
|
||||
<span>Text selection/processing</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="links/index.html">
|
||||
<a href="links/index.html#">
|
||||
<span>Links</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<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="tips/index.html#">
|
||||
<span>Tips</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="html5/index.html#">
|
||||
<span>Html5 applications</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="bookmarklet/index.html">
|
||||
<a href="bookmarklet/index.html#">
|
||||
<span>Bookmarklets</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="pccopy/index.html">
|
||||
<span>Text selection</span>
|
||||
<a href="globalcss/index.html#">
|
||||
<span>CSS styles</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="globalcss/index.html">
|
||||
<span>CSS样式</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="icons/index.html">
|
||||
<a href="icons/index.html#">
|
||||
<span>Toolbar customization</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="longclick/index.html">
|
||||
<a href="searchcat/index.html#">
|
||||
<span>Search engine files</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<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="longclick/index.html#">
|
||||
<span>Long pressed link menu</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="filecap/index.html">
|
||||
<a href="tools/index.html#">
|
||||
<span>Tools</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="filecap/index.html#">
|
||||
<span>Custom file handling</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="post">
|
||||
<a href="adblock_domain/index.html">
|
||||
<span>Blocking domain trees</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 href="gesture/index.html#">
|
||||
<span>Gestures</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
<li class="post">
|
||||
<a href="searchurl/rjs.html">
|
||||
<span>Javascript</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="post">
|
||||
<a href="searchurl/cmds.html">
|
||||
<span>Commands</span>
|
||||
<a href="searchurl/webdav.html#">
|
||||
<span>webdav storage menu generator</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container">
|
||||
© 2018-2024 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>
|
||||
|
|
320
en/index.xml
320
en/index.xml
|
@ -1,188 +1,250 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title></title>
|
||||
<title>uweb browser: unlimited power</title>
|
||||
<link>/en/</link>
|
||||
<description>Recent content on </description>
|
||||
<generator>Hugo -- gohugo.io</generator>
|
||||
<lastBuildDate>Sat, 02 Jul 2022 00:00:00 +0000</lastBuildDate><atom:link href="/en/index.xml" rel="self" type="application/rss+xml" />
|
||||
<description>Recent content on uweb browser: unlimited power</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Fri, 19 Jul 2024 10:06:21 +0800</lastBuildDate>
|
||||
<atom:link href="/en/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Site map</title>
|
||||
<link>/en/sitemap/</link>
|
||||
<pubDate>Sat, 02 Jul 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/sitemap/</guid>
|
||||
<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>
|
||||
<title>Text selection</title>
|
||||
<link>/en/ebrowser/eb_select/</link>
|
||||
<pubDate>Fri, 12 Jul 2024 00:00:00 +0000</pubDate>
|
||||
<guid>/en/ebrowser/eb_select/</guid>
|
||||
<description>Click the following links to install context menus for text selection.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Text selection/processing</title>
|
||||
<link>/en/textprocess/</link>
|
||||
<pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/textprocess/</guid>
|
||||
<description>Click the following links to install menus for long pressing the button &quot;link&quot;:
note.ms: cloud text sharing, please replace &quot;ric&quot; with your favorite ID
Copy selected text with html format to clipboard
Search with home screen
google Translate
bing translate
deepL
The file &quot;default.select&quot; 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:</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Links</title>
|
||||
<link>/en/links/</link>
|
||||
<pubDate>Sat, 28 Oct 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/links/</guid>
|
||||
<description>Click the following links to install menus popped by long pressing the bookmark button (with star as icon):
Capture long screenshot (need long screenshot mode)
Select All:CTRL-A/undo:CTRL-Z/Redo:CTRL-Y
Extend site cookies to 10 years
Clear site cookies
VPN
Switch configuration
Wait for network msg
Certificate info
Backup to box.com
Restore from box.com
upload to box.com
More webdav link menu items
Web fullscreen
Long pressing the bookmark button in uweb browser will popup menus defined in file &quot;default.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>cron</title>
|
||||
<link>/en/tcron/</link>
|
||||
<pubDate>Wed, 25 Oct 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tcron/</guid>
|
||||
<description>crontab (with enhanced semantics) For performance, the file &quot;crontab&quot; uses single space as field separator. Letters are not suppored currently. So use &quot;1&quot; for &quot;January&quot; and 2 for &quot;Tuesday&quot; etc.
The sixth field in crontab file could be in the format of internal links. Specifically, &quot;c:&quot; to execute the following commands in termux and &quot;!&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.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Offline resources</title>
|
||||
<link>/en/offlinecache/</link>
|
||||
<pubDate>Tue, 11 Apr 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/offlinecache/</guid>
|
||||
<description>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.
Serverless local sites Click to install url service that extracts web apps to the folder &quot;sitecache/local/&quot;: support web extensions (.crx for chrome &amp; .xpi for firefox).
Any folder under &quot;sitecache&quot; can be visited as a local site.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Resource redirection</title>
|
||||
<link>/en/redirect/</link>
|
||||
<pubDate>Tue, 11 Apr 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/redirect/</guid>
|
||||
<description>⚠️Redirection forwards cookies with the setting option &quot;Redirect cookies&quot; enabled, so use the options with care.
Setting options: &quot;Url redirection&quot; vs. &quot;Resource redirection&quot; &quot;Url redirection&quot; redirects the main/page url only while &quot;Resource redirection&quot; is for all urls in the page.
Global redirection Global redirection is enabled with the setting option &quot;Resource redirection&quot; or both &quot;Url redirection&quot; and &quot;Redirect cookies&quot;.
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.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Hosts files</title>
|
||||
<link>/en/adblock_domain/</link>
|
||||
<pubDate>Mon, 20 Mar 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/adblock_domain/</guid>
|
||||
<description>The enhanced hosts files &quot;hosts&quot; and &quot;default.hosts&quot; take effect with the setting option &quot;use hosts&quot;.
hosts The enhanced file &quot;hosts&quot; defines IP addresses/attributes for domains. Each line has the following format:
[[IP address][attributes]][single space][domain name]
where &quot;[[IP address][attributes]]&quot; could be:
ipv4 address such as:
172.67.157.211 torapp.eu.org
ipv6 address, Ex.:
[2606:4700:3037::6815:8c3] torapp.eu.org
empty, that would lift all server-imposed limitations. Ex.:
[single space]gitee.com
which will make all git repositories on the domain visitable as websites with raw file access url.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Search engines</title>
|
||||
<link>/en/search/</link>
|
||||
<pubDate>Tue, 07 Mar 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/search/</guid>
|
||||
<description>Clicking the following links to install search engines with uweb browser. ebrowser 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:
andi:https://andisearch.com/?q=
thinkany:https://thinkany.so/search?q=
phind:https://phind-ai.com/search?q=
iask:https://iask.ai/?q=
devv:https://devv.ai/search?agentMode=false&amp;q=
perplexity:https://www.perplexity.ai/?q=
youChat:https://you.com/search?tbm=youchat&amp;q=
youWrite:https://you.com/search?tbm=youwrite&amp;q=
youImagine:https://you.com/search?tbm=imagine&amp;q=
you:https://you.com/search?q=
medisearch:https://medisearch.io/results/
explorer:https://explorer.globe.engineer/?q=
consensus:https://consensus.app/results/?synthesize=on&amp;q=
yoursearch:https://app.yoursearch.ai/?q=
awesomerepo:https://www.awesome-repositories.com/s/results-with-ai/
chatGPT:i:0/js/s2ta.js:https://chat.openai.com/?%s
lepton:i:0/js/s2input.js:https://search.lepton.run/?%s
Recommended engines (click or append any of the following to the file &quot;home5.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>JS/CSS/HTML/preprocessing for domains</title>
|
||||
<link>/en/sitejs/</link>
|
||||
<pubDate>Sat, 28 Jan 2023 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 &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. 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. Long press the button &quot;settings&quot;, check the option &quot;Run user scripts&quot;.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Bookmarks</title>
|
||||
<link>/en/bookmark/</link>
|
||||
<pubDate>Mon, 16 Jan 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/bookmark/</guid>
|
||||
<description>AI, chatgpt etc.
google gemini jeeves morphic komo iaskAI poe freegpt teach-anything magickpen note.ms
rentry
Wait for url from other devices
berify: reverse image search for video
Associated bookmarks Search engine files 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.
&quot;help_en.html&quot; bookmark associates with the user manual in English. Similarly, &quot;help_zh.html&quot; is for Chinese manual.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Tips</title>
|
||||
<link>/en/tips/</link>
|
||||
<pubDate>Mon, 16 Jan 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tips/</guid>
|
||||
<description>Text processing for clipboard data:
On home screen, pressing the sharing button of the bottom toolbar popups the text processing menu for clipboard data.
To show web pages in desktop mode:
PC button + option &quot;wide viewport&quot; + global js &quot;force page resizable&quot;.
Playing audio when screen off
Option &quot;Floating video&quot; + video fullscreen playing
Multiple home screens and Next/Prev page:
home5.html, home6.mht(or .search or .html), home7.mht(or .search or .html), .</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Address bar command line</title>
|
||||
<link>/en/acmd/</link>
|
||||
<pubDate>Sun, 08 Jan 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/acmd/</guid>
|
||||
<description>&quot;:!&quot; ( or &quot;!&quot;) command line Pressing &quot;:&quot; or &quot;!&quot; with hardware keyboard sets focus on the address bar.
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.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Any url as website</title>
|
||||
<link>/en/url2site/</link>
|
||||
<pubDate>Sun, 30 Oct 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/url2site/</guid>
|
||||
<description>The uweb internal link &quot;i:0m&quot; make any url such as download or indirect links visitable as a website. The second part of mirrors has examples using the following tricks:
&quot;i:0m04:[url]&quot;: to treat the [url] content as html with bookmarklet. &quot;i:0m?:[url]&quot;: to treat the [url] content as html, handling css/js properly. &quot;i:0m?[postfix]:[url]&quot;: auto append query postfix to url to retrieve content. &quot;i:0mi:5h:[url]&quot;: similar to &quot;i:0m?:[url]&quot;, to treat the [url] content as html (for download or no-script links etc.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Html5 applications</title>
|
||||
<link>/en/html5/</link>
|
||||
<pubDate>Sun, 02 Oct 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/html5/</guid>
|
||||
<description>This page is for uweb browser.
Click to install the following html5 apps:
Huge markdown file viewer
Huge markdown+katex file viewer (Tex formulas)
Huge markdeep file viewer (markdown, latex, diagram,graphviz etc.)
plyr video player
dplayer video player
pdf viewer
epub reader (author:llili)
djvu viewer
The corresponding menus can be installed with url services.
Features The following mentioned subfolders locate in the configuration folder.
The following html5 applications are allowed to read local files referred by &quot;https://local/sdcard/.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Downloads</title>
|
||||
<link>/en/changelog/</link>
|
||||
<pubDate>Fri, 16 Sep 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/changelog/</guid>
|
||||
<description>Amazon appstore
Galaxy.Store
uweb, termux &amp; history versions
github
sourceforge
powerfolder
udrop
pagure
mcbebbs
Main features Change logs 1048: enhance file downloading. Previous versions may fail for few sites.
1047: add huge markdown file viewer
1038: support chatBot as search engine with url &quot;i:0/js/hash2textarea.js:https://XXX&quot;
1036: TV mode: reuse &quot;engine.search&quot; as live TV channel urls.
1034: click share button on homescreen to process clipboard text.
1030: Allow downloading with global redirection</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Configuration</title>
|
||||
<link>/en/sitemap/</link>
|
||||
<pubDate>Thu, 28 Jul 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/sitemap/</guid>
|
||||
<description>Mirrors
Check for updates
UI Search engines Home screens UI (gitee) webdav install-able menu generator Customization Long pressing menus for toolbar buttons User agents Javascript Url services Links Commands Remote javascript Menu for selections Menu for long pressing hypertext Toolbar Gestures Address bar command modes Advanced Advanced Content AD blocking CSS styles Redirection Offline cache JS/CSS/HTML/preprocessing for domains Any urls as website Tools Bookmarklets Cron &amp; more Custom file handling Html5 application Termux Info Manual Tips Configuration files Bookmarks </description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Configuration folders/files</title>
|
||||
<link>/en/filenames/</link>
|
||||
<pubDate>Thu, 30 Jun 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/filenames/</guid>
|
||||
<description>All folders end with character &quot;/&quot; and others are files. All folders/files locate in &quot;/data/data/info.torapp.uweb/files&quot;:
|
||||
&quot;css/&quot;: global css folder
|
||||
&quot;js/&quot;: global script folder
|
||||
&quot;sitejs/&quot;: script folder for domains
|
||||
&quot;sitecss/&quot;:CSS folder for domains
|
||||
&quot;bookmarklet/&quot;:bookmarklets, long pressing the &quot;JS&quot; button to execute.
|
||||
&quot;offline/&quot;: to save offline pages
|
||||
&quot;sbookmark/&quot;: to save super bookmarks
|
||||
&quot;sitecache/&quot;:offline cache
|
||||
&quot;longclick/&quot;: menus to appear when long-pressing hypertext (js files)
|
||||
&quot;icon/&quot;:customized icons
|
||||
&quot;app[XXX]/&quot;:html5 applications
|
||||
&quot;default.longclick&quot;: to configure menus when long-pressing hypertext.</description>
|
||||
<description>All folders end with character &quot;/&quot; and others are files. All folders/files locate in &quot;/data/data/info.torapp.uweb/files&quot;:
&quot;css/&quot;: global css folder
&quot;js/&quot;: global script folder
&quot;sitejs/&quot;: script folder for domains
&quot;sitecss/&quot;:CSS folder for domains
&quot;bookmarklet/&quot;:bookmarklets, long pressing the &quot;JS&quot; button to execute.
&quot;offline/&quot;: to save offline pages
&quot;sbookmark/&quot;: to save super bookmarks
&quot;sitecache/&quot;:offline cache
&quot;longclick/&quot;: menus to appear when long-pressing hypertext (js files)
&quot;icon/&quot;:customized icons
&quot;app[XXX]/&quot;:html5 applications
&quot;default.longclick&quot;: to configure menus when long-pressing hypertext.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Links</title>
|
||||
<link>/en/links/</link>
|
||||
<pubDate>Thu, 30 Jun 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/links/</guid>
|
||||
<description>Clicking the following hypertext will install menus for long pressing the bookmark button (with star as icon):
|
||||
Certificate info
|
||||
Web fullscreen
|
||||
Long pressing the bookmark button in uweb browser will popup menus defined in file &quot;default.link&quot;. The file format is as follows:
|
||||
[Menu name]:[url][space][javascript code]
|
||||
in which space and later parts are optional. url and later parts support &quot;%u&quot;,&quot;%s&quot; etc.. The javascript code will be executed after url is fully loaded.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>AD blocking</title>
|
||||
<link>/en/adblock/</link>
|
||||
<pubDate>Sat, 25 Jun 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/adblock/</guid>
|
||||
<description>Host blocking。
|
||||
Use bookmarklet &quot;list all script urls&quot; to generate url links, long pressing dubious script (usually 3rd-party library) link, click &quot;Block domain root&quot;. Javascript and CSS for domains。
|
||||
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)!</description>
|
||||
<description>Host blocking。
Use bookmarklet &quot;list all script urls&quot; to generate url links, long pressing dubious script (usually 3rd-party library) link, click &quot;Block domain root&quot;. Javascript and CSS for domains。
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)!</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Bookmarklets</title>
|
||||
<link>/en/bookmarklet/</link>
|
||||
<pubDate>Fri, 24 Jun 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/bookmarklet/</guid>
|
||||
<description>With a href=&quot;../index.html&quot;&gt;uweb browser, long pressing any bookmarklet link, click &quot;Open in new tab&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 &quot;GET&quot; method for &quot;POST&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>
|
||||
<description>With uweb browser, long pressing any bookmarklet link, click &quot;Open in new tab&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 &quot;GET&quot; method for &quot;POST&quot;
Shows all form elements
Enables all form elements
Toggle checkboxes
Check all checkboxes
Uncheck all checkboxes
Toggle all checkboxes in forms
Enable selection
Restore context menu</description>
|
||||
</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 &quot;link&quot;:
|
||||
google Translate
|
||||
bing translate
|
||||
deepL
|
||||
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:
|
||||
[Name]:[mimetype]:[command line]
|
||||
[mimetype] specifies input/output for [command line].
|
||||
It formats as &quot;[input mimetype]/[output mimetype]&quot;.
|
||||
[input mimetype] can be the following:
|
||||
&quot;html&quot;: rich text &quot;&quot; (empty): text &quot;.</description>
|
||||
<title>Url services</title>
|
||||
<link>/en/urls/</link>
|
||||
<pubDate>Fri, 10 Jun 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/urls/</guid>
|
||||
<description>Click the following links to install url services with uweb browser or ebrowser. Force exit and re-launch the app, then long press the &quot;image&quot; button to popup the menu.
Fullscreen video:i:5f
Redirect/edit:e:
Save2autocomplete:i:51:
Bookmark:i:52:
Note:i:53:
Save engine:i:54:
Save link:i:55:
Save to desktop:i:58
markdownview:i:0m-/js/mdview.html:
Add to media storage::001
Extract web app:i:0bsitecache/local/:
tgurl:https://tx.me/share/url?url=
tgdownload:https://tx.me/share/url?url=../download Compatible mode:i:5d
papago:https://papago.naver.net/website?locale=en&amp;target=en&amp;url=
google translate:https://translate.google.com/translate?sl=auto&amp;tl=en&amp;u=
Source:view-source:
outline:https://www.outline.com/
2pdf:https://www.web2pdfconvert.com#
printfriendly:https://www.printfriendly.com/print/?url=
htmlview:https://htmlview.glitch.me/?
htmlpreview:https://htmlpreview.github.io/?
webarchive:https://web.archive.org/web/*/
archive:https://archive.is/?run=1&amp;url=
googlecache:http://webcache.googleusercontent.com/search?q=cache:
google by image:https://www.google.com/searchbyimage?safe=off&amp;image_url=
tinyeye:https://tineye.com/search?url=</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>CSS样式</title>
|
||||
<title>Commands</title>
|
||||
<link>/en/cmds/</link>
|
||||
<pubDate>Thu, 02 Jun 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/cmds/</guid>
|
||||
<description>Click the following links to install commands with uweb browser. Force exit and re-launch the app, then long press the button with clock icon to popup the command menu.
Configuration file &quot;default.cmds&quot; examples:
Clear data::toybox find /data/data/info.torapp.uweb/app_webview ! -name 'Cookies' ! -name '*.cjar' -type f -delete
Clear database::rm -rf /data/data/info.torapp.uweb/databases/*
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
Clear cache::toybox rm -rf /data/data/info.torapp.uweb/cache
Clear logcat::logcat -c</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Execute javascript codes</title>
|
||||
<link>/en/rjs/</link>
|
||||
<pubDate>Wed, 01 Jun 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/rjs/</guid>
|
||||
<description>javascript for domains
Earliest loaded global javascript files locates in the subfolder &quot;css&quot; of app private folder.
Global javascript files locates in the subfolder &quot;js&quot; of app private folder. Long press button [☰] to configure. Click the following links to install:
Save password
Instant page
large size javascript code can be installed to the folder &quot;bookmarklet&quot; (long pressing button &quot;js&quot; to popup menu):
google translation
Eruda
Performance
Note: Bookmarklets whose names begin with &quot;!</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>CSS styles</title>
|
||||
<link>/en/globalcss/</link>
|
||||
<pubDate>Sun, 03 Apr 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/globalcss/</guid>
|
||||
<description>Uweb browser loads all &quot;.css&quot; files under the folder &quot;css&quot; as global css. Click the following links to install global css files:
|
||||
Clearing font settings
|
||||
The file &quot;night.css&quot; is used as night mode, click the following links to install one:
|
||||
webview 81+ night mode
|
||||
webview 80- night mode</description>
|
||||
<description>Uweb browser loads all &quot;.css&quot; files under the folder &quot;css&quot; as global css. Click the following links to install global css files:
Clearing font settings
The file &quot;night.css&quot; is used as night mode, click the following links to install one:
webview 81+ night mode
webview 80- night mode
Earliest loaded global js The &quot;.js&quot; files under the folder &quot;css&quot; are loaded as earlier as possible on the page.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Toolbar customization</title>
|
||||
<link>/en/icons/</link>
|
||||
<pubDate>Sun, 06 Feb 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/icons/</guid>
|
||||
<description>If subfolder &quot;icon&quot; exists, then files named as &quot;0&quot;,&quot;1&quot;,&quot;2&quot;...
|
||||
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,...
|
||||
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格式图标文件。</description>
|
||||
<description>If subfolder &quot;icon&quot; exists, then files named as &quot;0&quot;,&quot;1&quot;,&quot;2&quot;...
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,...
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.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Search engine files</title>
|
||||
<link>/en/searchcat/</link>
|
||||
<pubDate>Mon, 10 Jan 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/searchcat/</guid>
|
||||
<description>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;.
Any &quot;.search&quot; file can be opened as search engine file, each line of which has one of the following formats:
[Engine name]:[url without '%s' inside]
[Engine name]:[url with '%s' as keyword]
[Engine name]:POST:[post params with '%s' as keyword]:[url]
[Engine name]:[Extra request headers]:[post params with '%s' as keyword]:[url]</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Termux</title>
|
||||
<link>/en/termux/</link>
|
||||
<pubDate>Sat, 01 Jan 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/termux/</guid>
|
||||
<description>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.
Termux bookmarks Long pressing the following links then either &quot;commands&quot;-&gt;&quot;bookmark&quot; to add bookmarks or &quot;open in new tab&quot; to execute.
GNU bc (basic calculator)
bc with all extensions
Click the following links to install termux configurations: .</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>User agents</title>
|
||||
<link>/en/useragents/</link>
|
||||
<pubDate>Sat, 01 Jan 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/useragents/</guid>
|
||||
<description>Clicking the following links to add user agents with uweb browser or ebrowser.
Edge for android
Edge for windows</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Long pressed link menu</title>
|
||||
<link>/en/longclick/</link>
|
||||
<pubDate>Fri, 06 Nov 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/longclick/</guid>
|
||||
<description>To run commands Each line of file &quot;default.longclick&quot; has the following format: (same as default.cmds)
|
||||
[Name]:[mimetype]:[command line]
|
||||
in which [command line] can have &quot;%c&quot; (cookie), &quot;%u&quot; (current url), &quot;%t&quot; (title) etc.
|
||||
To visit url and load javascript file All &quot;.js&quot; files under the folder &quot;longclick&quot; are part of the popup menu.
|
||||
These javascript files are in the following format:
|
||||
The very first line can begin with &quot;//&quot; followed by website url that can have &quot;%u&quot; (current url), &quot;%t&quot; (title) etc.</description>
|
||||
<description>To run commands Each line of file &quot;default.longclick&quot; has the following format: (same as default.cmds)
[Name]:[mimetype]:[command line]
in which [command line] can have &quot;%c&quot; (cookie), &quot;%u&quot; (current url), &quot;%t&quot; (title) etc.
To visit url and load javascript file All &quot;.js&quot; files under the folder &quot;longclick&quot; are part of the popup menu.
These javascript files are in the following format:
The very first line can begin with &quot;//&quot; followed by website url that can have &quot;%u&quot; (current url), &quot;%t&quot; (title) etc.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Tools</title>
|
||||
<link>/en/tools/</link>
|
||||
<pubDate>Sun, 06 Sep 2020 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tools/</guid>
|
||||
<description>This page is for uweb browser.
install tdict_local (search with local indexes and remote content) Click to install the following local indexes with corresponding search engines (for test only).
install the indexes for &quot;American heritage dictionary (en-en&amp;zh with AHD/D.J./K.K. pronunciation)&quot;
Install AHD to home screen
Indexes for &quot;研究社新編英和活用大辞典(English usage: en-en&amp;ja)&quot;
Install &quot;English usage (en-en&amp;ja)&quot;
Indexes for SOED6
install SOED
The following dictionaries work better with markdown processor.
Install markdown processor</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Custom file handling</title>
|
||||
<link>/en/filecap/</link>
|
||||
<pubDate>Mon, 24 Aug 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/filecap/</guid>
|
||||
<description>Long press the settings button, check the option &quot;custom file handling&quot; to enable the functionality.
|
||||
The custom file handling configuration file is &quot;default.filecap&quot;, each line of it has the format as follows:
|
||||
[file extension]:[mimetype]:[command line]
|
||||
The &quot;[file extension]&quot; part can have at most two-segment of extensions such as &quot;txt.xz&quot;,&quot;html.gz&quot;.
|
||||
&quot;[mimetype]&quot; indicates the type of &quot;[command line]&quot; output.
|
||||
&quot;[command line]&quot; is same as the one in default.cmds. The most often used replacements are:</description>
|
||||
<description>Long press the settings button, check the option &quot;custom file handling&quot; to enable the functionality.
The custom file handling configuration file is &quot;default.filecap&quot;, each line of it has the format as follows:
[file extension]:[mimetype]:[command line]
The &quot;[file extension]&quot; part can have at most two-segment of extensions such as &quot;txt.xz&quot;,&quot;html.gz&quot;.
&quot;[mimetype]&quot; indicates the type of &quot;[command line]&quot; output.
&quot;[command line]&quot; is same as the one in default.cmds. The most often used replacements are:</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Blocking domain trees</title>
|
||||
<link>/en/adblock_domain/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/adblock_domain/</guid>
|
||||
<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 &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.
|
||||
Each line of the hosts file has the following format:</description>
|
||||
<title>Gestures</title>
|
||||
<link>/en/gesture/</link>
|
||||
<pubDate>Thu, 18 Jun 2020 00:00:00 +0000</pubDate>
|
||||
<guid>/en/gesture/</guid>
|
||||
<description>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.
Swipe left/right near the toolbar to switch window; fling left/right to switch to the last/first window.
Swiping on the top part of content window (near the top address bar by default) triggers corresponding link in the file &quot;default.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Change log</title>
|
||||
<link>/en/changelog/</link>
|
||||
<title></title>
|
||||
<link>/en/ebrowserreadme/</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>
|
||||
<guid>/en/ebrowserreadme/</guid>
|
||||
<description>Ebrowser: keyboard-friendly minimal suckless web browser Ebrowser is designed with the philosophy of Android uweb browser (gitlab).
lightweight (less than 20k bytes) without bundled electron. much less memory footprint than edge/chrome browser and highly performant. keyboard friendly with vim-style keymaps and command line support in address bar. global redirection to bypass censorship. user CSS/JS at will. Ex. pressing &quot;md&quot; in no-focus mode to preview markdown file. global CSS/JS for all sites at will.</description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Javascript and CSS for domains</title>
|
||||
<link>/en/sitejs/</link>
|
||||
<title></title>
|
||||
<link>/en/mirrors/</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 &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. 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. Long press the button &quot;settings&quot;, check the option &quot;Run user scripts&quot;.</description>
|
||||
<guid>/en/mirrors/</guid>
|
||||
<description>Mirrors (for version 1040+) gitee
gitcode
gitcode
gitea
notabug
launchpad
framagit
agit
froggi
disroot
gitdab
pagure
bitbucket
jsdelivr
dagshub
gitgud
gitly
gitnet
palemoon
tilde
dotclear
mimetest
chapril
cryto
antopie
bgithub
Mirrors (for all versions) 试验1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 gitly gitnet palemoon tilde dotclear minetest chapril cryto antopie Repositories gitlab
sourceforge
github
bitbucket
codeberg
gitee</description>
|
||||
</item>
|
||||
<item>
|
||||
<title></title>
|
||||
<link>/en/readme/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
<guid>/en/readme/</guid>
|
||||
<description>Uweb browser: minimal suckless web browser with unlimited power 中文
Amazon appstore
Galaxy.Store
Downloads
Uweb browser: downloads, plugins and tips
(Mirrors: gitlab codeberg repo 4everland fleek cyclic netlify surge kinsta zeabur deno bitbucket pages vercel render glitch More...)
Powerful: any native functionality with html5 enhancement and still secure; any urls to host website; javascript and shell scripting for general processing; piping between console and GUI and more with Termux. Customizable: user-defined menus, (new) buttons and gestures for user agents, bookmarklets, url services, shell commands, internal functionality links and text processing etc.</description>
|
||||
</item>
|
||||
|
||||
</channel>
|
||||
</rss>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Links</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
|
@ -28,7 +28,7 @@
|
|||
</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 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>
|
||||
|
@ -47,18 +47,32 @@
|
|||
<ul class="tags">
|
||||
|
||||
</ul>
|
||||
<p>Clicking the following hypertext will install menus for long pressing the bookmark button (with star as icon):<br>
|
||||
<a href="i:0gdefault.link::Certificate info:i:1b%0A">Certificate info</a></p>
|
||||
<p>Click the following links to install menus popped by long pressing the bookmark button (with star as icon):<br>
|
||||
<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><br>
|
||||
<a href="i:0gdefault.link::Extend cookies::0cc;Max-Age=315360000%0A">Extend site cookies to 10 years</a><br>
|
||||
<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>Long pressing the bookmark button in <a href="../index.html">uweb browser</a> will popup menus defined in file "default.link". The file format is as follows:<br>
|
||||
[Menu name]:[url][space][javascript code]</p>
|
||||
<p>in which space and later parts are optional. url and later parts support <a href="../cmd/index.html">"%u","%s" etc.</a>. The javascript code will be executed after url is fully loaded.</p>
|
||||
<p>Long pressing the bookmark button in <a href="../index.html#">uweb browser</a> will popup menus defined in file "default.link". The file format is as follows:<br>
|
||||
[Menu name]:[one or more links delimited by " \n "]</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="../cmd/index.html#">"%u","%s" 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>uweb browser will handle local file urls (file:///) specially for some file types:</p>
|
||||
<ul>
|
||||
<li>.js file(same as <a href="../longclick/index.html">long pressing hypertext to execute js file</a>): If the ".js" file begins with "//", then uweb browser will load the site following "//" 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 ".js" file begins with "//", then uweb browser will load the site following "//" and execute the following js code.</li>
|
||||
</ul>
|
||||
<p><a href="../gesture/index.html">default.gesture</a> and default.button have the exactly same file format. ".gesture" files define gestures while ".button" 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. ".gesture" files define gestures while ".button" define bottom toolbar button pressing actions from the last button to the first.</p>
|
||||
<p>proxy config:<br>
|
||||
httpproxy::010[proxy host]:[port]<br>
|
||||
socks5::011[socks host]:[port]<br>
|
||||
|
@ -66,10 +80,6 @@ noproxy::010:</p>
|
|||
<h3 id="special-links-beginning-with-">special links beginning with ':'</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<p>:0000<br>
|
||||
Extend cookie expiracy to 70 years, may be denied by server.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>:0003<br>
|
||||
Toggle fullscreen mode</p>
|
||||
</li>
|
||||
|
@ -82,10 +92,6 @@ Rotate the screen</p>
|
|||
Scan the fileurl and add it to media storage</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>:002[url]<br>
|
||||
Show the secure cookie</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>:010[proxy host]:[port]<br>
|
||||
Config http proxy, ":010:" to disable any proxy.</p>
|
||||
</li>
|
||||
|
@ -93,15 +99,54 @@ Config http proxy, ":010:" to disable any proxy.</p>
|
|||
<p>:011[socks host]:[port]<br>
|
||||
Socks proxy</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>:0cc[url1]:[url2][:;[cookie attributes]]<br>
|
||||
cookie copy from url1 to url2, the last part "[:;[cookie attributes]]" is optionable.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 id="commands">commands</h4>
|
||||
<ul>
|
||||
<li>
|
||||
<p>:![command line]<br>
|
||||
The command line could be a ".js", ".sh" or other executable with arguments. Ex. ":!s g keyword" could invoke "s.js" executable with the whole string as arguments ("s.sh" or "s" if file exists, here "g" as google search engine); ":! g keyword" would invoke the file ".js" or ".sh" 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 "s.sh"</a><br>
|
||||
<a href="i:0h.js:../searchurl/txt/web.js">Click to install the example file ".js"</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>:c[command]</p>
|
||||
<ul>
|
||||
<li>close<br>
|
||||
":cclose" to close the current window/tab.</li>
|
||||
<li>profile [parent folder] [file/folder] [optional ID]<br>
|
||||
Ex. ":cprofile . files" to switch configurations</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 "/sdcard/Download" folder, all units are milliinch.<br>
|
||||
Ex. ":p x" or ":px" for screen width and infinite height (as long vector screenshot).<br>
|
||||
":p x[height]" or ":px[height]" for screen width.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3 id="i-internal-links">"i:" internal links:</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<p>i:0m[bookmarklet index|prefix|c[cssFlag]]:[url]<br>
|
||||
Visiting url and execute the uweb browser internal bookmarklet, [bookmarklet index] must have at least two digits. For example, "00" as the first local bookmarklet; "01" as the first remote script; then "02" as the second local bookmarklet, ...</p>
|
||||
<p>i:0b[path]:[url]<br>
|
||||
Extract remote content (tar/tgz/zip) under the folder [path]. If [path] ends with "/", then put unzipped file under the folder "[path]/[file name stem]" (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>
|
||||
<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 have two digits. They are used as index of bootmarklet. For example, "00" as the first local bookmarklet; "01" as the first remote script; then "02" as the second local bookmarklet, ...</li>
|
||||
<li>c[cssFlag]: For example, "c12" 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 "[prefix]+url".</li>
|
||||
<li>H[headers]: Ex. "HX-Forwarded-For;8.8.8.8" adds extra http request header "X-Forwarded-For:8.8.8.8".</li>
|
||||
<li>[?postfix]: the real visited url is "[url]+[?postfix]".</li>
|
||||
<li>[/.../localfile]: load the local html/js file that processes [url]. The first character of the local html file must be "<".</li>
|
||||
<li>All other cases will be treated as [prefix], the real visited url is "[prefix]+[url]".</li>
|
||||
<li>Since <a href="../rjs/index.html#">activated scripts</a> use internal mechanism of "i:0m" urls, the script itself cannot have 'H', '?' as its very first character.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
|
@ -123,18 +168,26 @@ Read partial data from url.<br>
|
|||
Append [string] to the address bar text.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>i:1b<br>
|
||||
<p>i:1c<br>
|
||||
Show web certificate.</p>
|
||||
</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>
|
||||
</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>
|
||||
</li>
|
||||
<li>
|
||||
<p>i:1e<br>
|
||||
Open file manager for removable SDCARD download folder</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>i:50[path]:[string]<br>
|
||||
Save [string] as file</p>
|
||||
</li>
|
||||
|
@ -160,7 +213,8 @@ Save as link.</p>
|
|||
</li>
|
||||
<li>
|
||||
<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 "Ctrl-A" into a text file, use "Ctrl-Q Ctrl-A" with emacs or "Ctrl-V Ctrl-A" with vim)</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>i:57[jscode]<br>
|
||||
|
@ -171,10 +225,6 @@ execute [jscode], even when js is disabled for the web page.</p>
|
|||
Save to the desktop.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>i:59[filename]<br>
|
||||
Send file content to network.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>i:5a[filename]<br>
|
||||
Receive content from network to the file.</p>
|
||||
</li>
|
||||
|
@ -199,20 +249,25 @@ TTS</p>
|
|||
play video fullscreen. if videourl is empty, then make following requestFullscreen() work.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>i:5g[videourl]<br>
|
||||
play video in external player</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>i:5h[url]<br>
|
||||
force html for url</p>
|
||||
<p>i:5h[?postfix:|/regex/replacement:|encoding:][url]<br>
|
||||
force html for [url] visiting</p>
|
||||
<ul>
|
||||
<li>[?postfix:] : the real url visited is "[url]+[?postfix]"</li>
|
||||
<li>[/regex/replacement:]: execute regular expression replacement for the "[url]", then visit the resulting url.</li>
|
||||
<li>[encoding:]: force web page encoding.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<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>
|
||||
<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>
|
||||
<p>i:60[path]:[url]<br>
|
||||
|
@ -227,12 +282,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>
|
||||
</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>
|
||||
Visiting [url], but use the second url as auto paging url.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>i:8d[url]<br>
|
||||
Force downloading [url]</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>i:8l[filename]<br>
|
||||
Loading configuration [filename]. Ex. "i:8lconfig.html" to reload config.html.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>i:92[http request headers separated by ';']:[url]<br>
|
||||
The "Host" 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 "i:0mi:92Host;209.216.230.240::https://news.ycombinator.com" to visit the site with specified IP address.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>i:b1[internal urls or javascript separated by "%0A"]<br>
|
||||
Bundle of internal urls, if it is an "i:0" url, then it should have the following format:<br>
|
||||
[title]%0A[msg]%0A[optional callback url%0A][i:0url].</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<p>Last Modified: 29 April 2024<br>
|
||||
update i:0m syntax<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">
|
||||
© 2018-2024 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>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<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>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
|
@ -28,7 +28,7 @@
|
|||
</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 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>
|
||||
|
@ -46,22 +46,51 @@
|
|||
</h1>
|
||||
<ul class="tags">
|
||||
|
||||
<li><a href="../tags/javascript">javascript</a> </li>
|
||||
<li><a href="../tags/javascript/index.html#">javascript</a> </li>
|
||||
|
||||
</ul>
|
||||
<h4 id="to-run-commands">To run commands</h4>
|
||||
<p>Each line of file "<a href="file:///data/data/info.torinfo.uweb/files/default.longclick">default.longclick</a>" has the following format: (same as <a href="../searchurl/cmds.html">default.cmds</a>)<br>
|
||||
<p>Each line of file "<a href="file:///data/data/info.torapp.uweb/files/default.longclick">default.longclick</a>" has the following format: (same as <a href="../cmds/index.html#">default.cmds</a>)<br>
|
||||
[Name]:[mimetype]:[command line]<br>
|
||||
in which [command line] can have <a href="../searchurl/cmds.html">"%c" (cookie), "%u" (current url), "%t" (title)</a> etc.</p>
|
||||
in which [command line] can have <a href="../cmds/index.html#">"%c" (cookie), "%u" (current url), "%t" (title)</a> etc.</p>
|
||||
<h4 id="to-visit-url-and-load-javascript-file">To visit url and load javascript file</h4>
|
||||
<p>All ".js" files under the folder "<a href="file:///data/data/info.torinfo.uweb/files/longclick/">longclick</a>" are part of the popup menu.<br>
|
||||
<p>All ".js" files under the folder "<a href="file:///data/data/info.torapp.uweb/files/longclick/">longclick</a>" are part of the popup menu.<br>
|
||||
These javascript files are in the following format:</p>
|
||||
<ul>
|
||||
<li>The very first line can begin with "//" followed by website url that can have <a href="../searchurl/cmds.html">"%u" (current url), "%t" (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 "//" followed by website url that can have <a href="../cmds/index.html#">"%u" (current url), "%t" (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 ".js" file, variable "arguments" 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 ".js" file name.</li>
|
||||
</ul>
|
||||
|
||||
</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">
|
||||
© 2018-2024 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>
|
||||
|
|
90
en/mirrors.md
Normal file
90
en/mirrors.md
Normal file
|
@ -0,0 +1,90 @@
|
|||
<style>a+br{display:none;}</style>
|
||||
#### Mirrors (for version 1040+)
|
||||
[gitee](https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html#)
|
||||
[gitcode](https://gitcode.net/uweb/uweb/-/raw/master/redirect.html#)
|
||||
[gitcode](https://raw.gitcode.com/uweb/uweb/raw/master/redirect.html#)
|
||||
[gitea](https://gitea.com/torappinfo/uweb/raw/branch/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#)
|
||||
[agit](https://agit.ai/jamesfengcao/uweb/raw/branch/master/redirect.html#)
|
||||
[froggi](https://git.froggi.es/jamesfengcao/uweb/raw/branch/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#)
|
||||
[palemoon](https://repo.palemoon.org/jamesfengcao/uweb/raw/branch/master/redirect.html#)
|
||||
[tilde](https://tildegit.org/jamesfengcao/uweb/raw/branch/master/redirect.html#)
|
||||
[dotclear](https://git.dotclear.org/jamesfengcao/uweb/raw/branch/master/redirect.html#)
|
||||
[mimetest](https://git.minetest.land/jamesfengcao/uweb/raw/branch/master/redirect.html#)
|
||||
[chapril](https://forge.chapril.org/jamesfengcao/uweb/raw/branch/master/redirect.html#)
|
||||
[cryto](https://git.cryto.net/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)
|
||||
<p>
|
||||
<a href="i:0mi:5h:https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html">试验1</a>
|
||||
<a href="i:0m?:https://gitcode.net/uweb/uweb/-/raw/master/redirect.html">2</a>
|
||||
<a href="i:0m?:https://raw.gitcode.com/uweb/uweb/raw/master/redirect.html">4</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://agit.ai/jamesfengcao/uweb/raw/branch/master/redirect.html">11</a>
|
||||
<a href="i:0m?:https://git.froggi.es/jamesfengcao/uweb/raw/branch/master/redirect.html">12</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://repo.palemoon.org/jamesfengcao/uweb/raw/branch/master/redirect.html ">palemoon</a>
|
||||
<a href="i:0m?:https://tildegit.org/jamesfengcao/uweb/raw/branch/master/redirect.html">tilde</a>
|
||||
<a href="i:0m?:https://git.dotclear.org/jamesfengcao/uweb/raw/branch/master/redirect.html">dotclear</a>
|
||||
<a href="i:0m?:https://git.minetest.land/jamesfengcao/uweb/raw/branch/master/redirect.html ">minetest</a>
|
||||
<a href="i:0m?:https://forge.chapril.org/jamesfengcao/uweb/raw/branch/master/redirect.html">chapril</a>
|
||||
<a href="i:0m?:https://git.cryto.net/jamesfengcao/uweb/raw/branch/master/redirect.html">cryto</a>
|
||||
<a href="i:0m?:https://code.antopie.org/jamesfengcao/uweb/raw/branch/master/redirect.html">antopie</a>
|
||||
</p>
|
||||
|
||||
#### 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)
|
||||
[gitcode](https://gitcode.com/uweb/uweb/overview)
|
||||
[gitcode](https://gitcode.net/uweb/uweb)
|
||||
[atomgit](https://atomgit.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)
|
||||
[agit](https://agit.ai/jamesfengcao/uweb/src/branch/master/README.md)
|
||||
[froggi](https://git.froggi.es/jamesfengcao/uweb/src/branch/master/README.md)
|
||||
[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)
|
||||
[palemoon](https://repo.palemoon.org/jamesfengcao/uweb/src/branch/master/README.md)
|
||||
[tilde](https://tildegit.org/jamesfengcao/uweb/src/branch/master/README.md)
|
||||
[dotclear](https://git.dotclear.org/jamesfengcao/uweb/src/branch/master/README.md)
|
||||
[mimetest](https://git.minetest.land/jamesfengcao/uweb/src/branch/master/README.md)
|
||||
[chapril](https://forge.chapril.org/jamesfengcao/uweb/src/branch/master/README.md)
|
||||
[cryto](https://git.cryto.net/jamesfengcao/uweb/src/branch/master/README.md)
|
||||
[antopie](https://code.antopie.org/jamesfengcao/uweb/src/master/README.md)
|
167
en/mirrors/index.html
Normal file
167
en/mirrors/index.html
Normal file
|
@ -0,0 +1,167 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title></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>
|
||||
|
||||
<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://gitcode.net/uweb/uweb/-/raw/master/redirect.html#">gitcode</a><br>
|
||||
<a href="https://raw.gitcode.com/uweb/uweb/raw/master/redirect.html#">gitcode</a><br>
|
||||
<a href="https://gitea.com/torappinfo/uweb/raw/branch/master/redirect.html#">gitea</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://agit.ai/jamesfengcao/uweb/raw/branch/master/redirect.html#">agit</a><br>
|
||||
<a href="https://git.froggi.es/jamesfengcao/uweb/raw/branch/master/redirect.html#">froggi</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://repo.palemoon.org/jamesfengcao/uweb/raw/branch/master/redirect.html#">palemoon</a><br>
|
||||
<a href="https://tildegit.org/jamesfengcao/uweb/raw/branch/master/redirect.html#">tilde</a><br>
|
||||
<a href="https://git.dotclear.org/jamesfengcao/uweb/raw/branch/master/redirect.html#">dotclear</a><br>
|
||||
<a href="https://git.minetest.land/jamesfengcao/uweb/raw/branch/master/redirect.html#">mimetest</a><br>
|
||||
<a href="https://forge.chapril.org/jamesfengcao/uweb/raw/branch/master/redirect.html#">chapril</a><br>
|
||||
<a href="https://git.cryto.net/jamesfengcao/uweb/raw/branch/master/redirect.html#">cryto</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>
|
||||
<p>
|
||||
<a href="i:0mi:5h:https://gitee.com/jamesfengcao/uweb/raw/master/redirect.html">试验1</a>
|
||||
<a href="i:0m?:https://gitcode.net/uweb/uweb/-/raw/master/redirect.html">2</a>
|
||||
<a href="i:0m?:https://raw.gitcode.com/uweb/uweb/raw/master/redirect.html">4</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://agit.ai/jamesfengcao/uweb/raw/branch/master/redirect.html">11</a>
|
||||
<a href="i:0m?:https://git.froggi.es/jamesfengcao/uweb/raw/branch/master/redirect.html">12</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://repo.palemoon.org/jamesfengcao/uweb/raw/branch/master/redirect.html ">palemoon</a>
|
||||
<a href="i:0m?:https://tildegit.org/jamesfengcao/uweb/raw/branch/master/redirect.html">tilde</a>
|
||||
<a href="i:0m?:https://git.dotclear.org/jamesfengcao/uweb/raw/branch/master/redirect.html">dotclear</a>
|
||||
<a href="i:0m?:https://git.minetest.land/jamesfengcao/uweb/raw/branch/master/redirect.html ">minetest</a>
|
||||
<a href="i:0m?:https://forge.chapril.org/jamesfengcao/uweb/raw/branch/master/redirect.html">chapril</a>
|
||||
<a href="i:0m?:https://git.cryto.net/jamesfengcao/uweb/raw/branch/master/redirect.html">cryto</a>
|
||||
<a href="i:0m?:https://code.antopie.org/jamesfengcao/uweb/raw/branch/master/redirect.html">antopie</a>
|
||||
</p>
|
||||
<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://gitcode.com/uweb/uweb/overview">gitcode</a><br>
|
||||
<a href="https://gitcode.net/uweb/uweb">gitcode</a><br>
|
||||
<a href="https://atomgit.com/jamesfengcao/uweb">atomgit</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://agit.ai/jamesfengcao/uweb/src/branch/master/README.md">agit</a><br>
|
||||
<a href="https://git.froggi.es/jamesfengcao/uweb/src/branch/master/README.md">froggi</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://repo.palemoon.org/jamesfengcao/uweb/src/branch/master/README.md">palemoon</a><br>
|
||||
<a href="https://tildegit.org/jamesfengcao/uweb/src/branch/master/README.md">tilde</a><br>
|
||||
<a href="https://git.dotclear.org/jamesfengcao/uweb/src/branch/master/README.md">dotclear</a><br>
|
||||
<a href="https://git.minetest.land/jamesfengcao/uweb/src/branch/master/README.md">mimetest</a><br>
|
||||
<a href="https://forge.chapril.org/jamesfengcao/uweb/src/branch/master/README.md">chapril</a><br>
|
||||
<a href="https://git.cryto.net/jamesfengcao/uweb/src/branch/master/README.md">cryto</a><br>
|
||||
<a href="https://code.antopie.org/jamesfengcao/uweb/src/master/README.md">antopie</a></p>
|
||||
|
||||
</div>
|
||||
<p>Last Modified: 18 June 2024<br>
|
||||
update mirrors<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">
|
||||
© 2018-2024 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>
|
96
en/offlinecache/index.html
Normal file
96
en/offlinecache/index.html
Normal file
|
@ -0,0 +1,96 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Offline resources</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">Offline resources
|
||||
<br>
|
||||
<span class="subtitle"></span>
|
||||
</h1>
|
||||
<ul class="tags">
|
||||
|
||||
</ul>
|
||||
<p>Offline resources locate in the folder "sitecache". With the option "use offline resources" enabled, the corresponding files in "sitecache/[domain name]/[full path including filename, the url path part]" 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 "sitecache/local/"</a>: support web extensions (.crx for chrome & .xpi for firefox).</p>
|
||||
<p>Any folder under "sitecache" 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 & .xpi for firefox) are just packaged websites. Ex. the "kiwix" extension can be extracted to the folder "sitecache/local/kiwix"<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 "https://local/kiwix/www/index.html#" in the browser.</p>
|
||||
<div class="footnotes" role="doc-endnotes">
|
||||
<hr>
|
||||
<ol>
|
||||
<li id="fn:1">
|
||||
<p>the folder name "local" is used as the domain name in the url. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</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">
|
||||
© 2018-2024 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>
|
|
@ -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 "link":<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 "default.select" 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 "[input mimetype]/[output mimetype]".<br>
|
||||
[input mimetype] can be the following:</p>
|
||||
<ul>
|
||||
<li>"html": rich text</li>
|
||||
<li>"" (empty): text</li>
|
||||
<li>".js" 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 "<a href="../searchurl/cmds.html">Commands</a>".</p>
|
||||
<ul>
|
||||
<li>regular mimetype such as "text/html": output as the mimetype</li>
|
||||
<li>"uweb": output as a link</li>
|
||||
<li>"termux": 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 "/", optionally append "?[prefix][<em>[postfix]]". For example, "file:///sdcard/?</em>.png" lists all .png files under the folder "/sdcard". Select files and process them with checked.js(such as "copy to PC" 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 "DISPLAY=:0 xsel -i"<br>
|
||||
richtext2PCClipboard:html:ssh [user:password]@192.168.2.102 "DISPLAY=:0 xsel -i"<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 "192.168.2.102".<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 "xsel" available to operate on copy/paste.</p>
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
140
en/readme/index.html
Normal file
140
en/readme/index.html
Normal file
|
@ -0,0 +1,140 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title></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">
|
||||
<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://galaxy.store/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://jamesfengcao.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.4everland.app/en/">4everland</a> <a href="https://uweb.on-fleek.app/en/">fleek</a> <a href="https://muweb.cyclic.app/en/">cyclic</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://posh-crab-23.deno.dev/en/">deno</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="https://uweb.glitch.me/en/">glitch</a> <a href="en/mirrors.md" onclick="if(notRepo()){location='../../en/mirrors/index.html#';return false;}">More...</a>)</p>
|
||||
<ul>
|
||||
<li>Powerful: any native functionality with html5 enhancement and still secure; any urls to host website; javascript and shell scripting for general processing; piping between console and GUI and more with Termux.</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>Convenient: Any AI chatbot/book (pdf/djvu)/dictionary (mdict)/txt/command line/app/webapp (web extensions) can be 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>URL bar command line support ("!" 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 "hosts" 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 & 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, enabling html5 apps for local files (pdf/djvu/epub viewer, mdict dictionary lookup etc.).</p>
|
||||
<ul>
|
||||
<li>User-defined global and site-specific CSS and javascript.</li>
|
||||
<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>Customization (define extra menus/buttons/gestures with user-defined functionalities)</li>
|
||||
<li>Support shell scripts, javascript for general processing, other languages (python etc.) are also supported by installing uweb compatible Termux versions.</li>
|
||||
<li>Serverless local sites: PWA-kind web extension (chrome .crx & firefox .xpi) support.</li>
|
||||
<li>Piping between console and uweb tabs.</li>
|
||||
<li>Resizable floating video support.</li>
|
||||
</ul>
|
||||
<h4 id="screenshots">Screenshots</h4>
|
||||
<p><img src="https://i.postimg.cc/rsL9G5N1/home1.png"><br>
|
||||
<img src="https://i.postimg.cc/9QxJ3Rc2/globalcss.png"><br>
|
||||
<img src="https://i.postimg.cc/VksDHBQ4/globaljs.png"><br>
|
||||
<img src="https://i.postimg.cc/HLV3TYLy/longclick.png"><br>
|
||||
<img src="https://i.postimg.cc/XJ58ysdN/option1.png"><br>
|
||||
<img src="https://i.postimg.cc/0NFnQT6H/option2.png"></p>
|
||||
<h4 id="a-hrefmiscebrowserreadmemd--onclickifnotrepolocationenebrowserreadmeindexhtmlreturn-falseebrowsera-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: 24 June 2024<br>
|
||||
move ebrowser README together with package files<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">
|
||||
© 2018-2024 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>
|
111
en/redirect/index.html
Normal file
111
en/redirect/index.html
Normal file
|
@ -0,0 +1,111 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Resource redirection</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">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 "Redirect cookies" enabled, so use the options with care.</p>
|
||||
<h4 id="setting-options-url-redirection-vs-resource-redirection">Setting options: "Url redirection" vs. "Resource redirection"</h4>
|
||||
<p>"Url redirection" redirects the main/page url only while "Resource redirection" 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 "Resource redirection" or both "Url redirection" and "Redirect cookies".</p>
|
||||
<p>When a valid global redirection url is set, the "default.redirect" 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 "[global redirection url] + [url]". For example, "https://domain.com/pathXXX/https://cnn.com".</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 "[global redirection url] + '/'+ [scheme]+ '/' + [url without scheme]". For example, when the global redirection url is "https://domain.com/pathXXX", the real url to visit "https://cnn.com" is "https://domain.com/pathXXX/https/cnn.com".</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h4 id="defaultredirect-valid-only-without-global-redirection-url">"default.redirect" (valid only without global redirection url)</h4>
|
||||
<p>Click the following links to append mirrors to the file "default.redirect":<br>
|
||||
<a target="_self" href="i:0gdefault.redirect:../../zh/searchurl/txt/redirect.cfg">google recaptcha mirror</a></p>
|
||||
<p>Each line of the file "default.redirect" has the following format:<br>
|
||||
[domain name]:[regular expression]:[replacement expression]</p>
|
||||
<p>in which "[regular expression]" is as defined by java language, and cannot have ":" inside; if empty, it defaults to be same as "[domain name]".</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 "url redirection".</li>
|
||||
<li>Long pressing the setting button, enable the option "Resource redirection".</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<p>Last Modified: 7 April 2024<br>
|
||||
more details on global redirection url<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">
|
||||
© 2018-2024 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>
|
110
en/rjs/index.html
Normal file
110
en/rjs/index.html
Normal file
|
@ -0,0 +1,110 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Execute javascript codes</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">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 "css" of app private folder.</p>
|
||||
<p><b>Global javascript</b> files locates in the subfolder "js" 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 "bookmarklet" (long pressing button "js" 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>Note: Bookmarklets whose names begin with "!" 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 "search" 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 "default.rjs" 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 "Activate user script".</p>
|
||||
<p>Since activated scripts use internal mechanism of <a href="../links/index.html#">"i:0m" 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 "bookmarklet", others needs to be refered in default.rjs as http urls such as "https://local/..." (<a href="../html5/index.html#">html5</a> or <a href="../offlinecache/index.html#">offline cache</a>) .</p>
|
||||
|
||||
</div>
|
||||
<p>Last Modified: 18 June 2024<br>
|
||||
update mirrors<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">
|
||||
© 2018-2024 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>
|
296
en/search/index.html
Normal file
296
en/search/index.html
Normal file
|
@ -0,0 +1,296 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Search engines</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">Search engines
|
||||
<br>
|
||||
<span class="subtitle"></span>
|
||||
</h1>
|
||||
<ul class="tags">
|
||||
|
||||
</ul>
|
||||
<p>Clicking the following links to install 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>AI:<br>
|
||||
<a href="i:00andi:https://andisearch.com/?q=">andi:https://andisearch.com/?q=</a></p>
|
||||
<p><a href="i:00thinkany:https://thinkany.so/search?q=">thinkany:https://thinkany.so/search?q=</a></p>
|
||||
<p><a href="i:00phind:https://phind-ai.com/search?q=">phind:https://phind-ai.com/search?q=</a></p>
|
||||
<p><a href="i:00iask:https://iask.ai/?q=">iask:https://iask.ai/?q=</a></p>
|
||||
<p><a href="i:00devv:https://devv.ai/search?agentMode=false&q=">devv:https://devv.ai/search?agentMode=false&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&q=</a></p>
|
||||
<p><a href="i:00youWrite:https://you.com/search?tbm=youwrite&q=">youWrite:https://you.com/search?tbm=youwrite&q=</a></p>
|
||||
<p><a href="i:00youImagine:https://you.com/search?tbm=imagine&q=">youImagine:https://you.com/search?tbm=imagine&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:00medisearch:https://medisearch.io/results/">medisearch:https://medisearch.io/results/</a></p>
|
||||
<p><a href="i:00explorer:https://explorer.globe.engineer/?q=">explorer:https://explorer.globe.engineer/?q=</a></p>
|
||||
<p><a href="i:00consensus:https://consensus.app/results/?synthesize=on&q=">consensus:https://consensus.app/results/?synthesize=on&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:00chatGPT:i:0/js/s2ta.js:https://chat.openai.com/?%s">chatGPT:i:0/js/s2ta.js:https://chat.openai.com/?%s</a></p>
|
||||
<p><a href="i:00lepton:i:0/js/s2input.js:https://search.lepton.run/?%s">lepton:i:0/js/s2input.js:https://search.lepton.run/?%s</a></p>
|
||||
<p>Recommended engines (click or append any of the following to the file "home5.search"):<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&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: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&num=100&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: "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>
|
||||
<a href="i:00google:https://google.com/search?q=">google:https://google.com/search?q=</a>
|
||||
<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&q=</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:00alexandria:https://www.alexandria.org/?q=">alexandria:https://www.alexandria.org/?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:00seekr:https://www.seekr.com/search?query=">seekr:https://www.seekr.com/search?query=</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://www.waldo.fyi/data?q=">waldo:https://www.waldo.fyi/data?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: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.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 href="i:00gramxlu:https://gramxly.com/s?q=">gramxlu:https://gramxly.com/s?q=</a></p>
|
||||
<p>language:<br>
|
||||
<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:00finedict:https://www.finedictionary.com/">finedict:https://www.finedictionary.com/</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&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>Science:<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&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&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>More engines:<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: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: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:00libreY:https://search.ahwx.org/search.php?q=">libreY:https://search.ahwx.org/search.php?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: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://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>Medical:<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&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>Scholar:<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&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>Developer:<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&q=">git:https://github.com/search?type=Repositories&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:00grep:https://grep.app/search?q=">grep:https://grep.app/search?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><a href="i:00cdn.githubjs.cf:https://cdn.githubjs.cf/search?q=">cdn.githubjs.cf:https://cdn.githubjs.cf/search?q=</a></p>
|
||||
<p><a href="i:00hub.yzuu:https://hub.yzuu.cf/search?q=">hub.yzuu:https://hub.yzuu.cf/search?q=</a></p>
|
||||
<p><a href="i:00hub.nuaa:https://hub.nuaa.cf/search?q=">hub.nuaa:https://hub.nuaa.cf/search?q=</a></p>
|
||||
<p><a href="i:00hub.njuu:https://hub.njuu.cf/search?q=">hub.njuu:https://hub.njuu.cf/search?q=</a></p>
|
||||
<p>app:<br>
|
||||
<a href="i:00App store:market://search?q=">App store:market://search?q=</a></p>
|
||||
<p>local engines(May need termux customized edition and tools like bc,gnuplot 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: 2 July 2024<br>
|
||||
update AI engines<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">
|
||||
© 2018-2024 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>
|
103
en/searchcat/index.html
Normal file
103
en/searchcat/index.html
Normal file
|
@ -0,0 +1,103 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Search engine files</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">Search engine files
|
||||
<br>
|
||||
<span class="subtitle"></span>
|
||||
</h1>
|
||||
<ul class="tags">
|
||||
|
||||
<li><a href="../tags/search%20engine/index.html#">search engine</a> </li>
|
||||
|
||||
</ul>
|
||||
<p>Search engine file names have ".search" as postfix. When they are clicked, the associated bookmark files with postfix ".search.html" would be appended. Ex: the associated bookmark for "foo.search" is "foo.search.html".</p>
|
||||
<p>Any ".search" 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. "X-Forwarded-For;8.8.8.8"</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 the first type that has no '%s' in the engine url.</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: 8 April 2024<br>
|
||||
add associated bookmarks<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">
|
||||
© 2018-2024 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>
|
1
en/searchurl/0m/hash2textarea.js
Normal file
1
en/searchurl/0m/hash2textarea.js
Normal 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();})()
|
99
en/searchurl/0m/mdview.html
Normal file
99
en/searchurl/0m/mdview.html
Normal 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>
|
92
en/searchurl/bingAI/bing.html
Normal file
92
en/searchurl/bingAI/bing.html
Normal 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>
|
205
en/searchurl/bingAI/css/DrawImg.css
Normal file
205
en/searchurl/bingAI/css/DrawImg.css
Normal 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%;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
582
en/searchurl/bingAI/css/bing.css
Normal file
582
en/searchurl/bingAI/css/bing.css
Normal 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 {}
|
||||
}
|
||||
}
|
54
en/searchurl/bingAI/draw.html
Normal file
54
en/searchurl/bingAI/draw.html
Normal 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>
|
42
en/searchurl/bingAI/js/GetSet.js
Normal file
42
en/searchurl/bingAI/js/GetSet.js
Normal 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);
|
||||
}
|
59
en/searchurl/bingAI/js/Write.js
Normal file
59
en/searchurl/bingAI/js/Write.js
Normal 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);
|
||||
};
|
294
en/searchurl/bingAI/js/bing.js
Normal file
294
en/searchurl/bingAI/js/bing.js
Normal 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();
|
||||
}
|
||||
|
||||
|
||||
|
266
en/searchurl/bingAI/js/bingChatHub.js
Normal file
266
en/searchurl/bingAI/js/bingChatHub.js
Normal 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
|
||||
};
|
||||
}
|
75
en/searchurl/bingAI/js/generateImages.js
Normal file
75
en/searchurl/bingAI/js/generateImages.js
Normal 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('&','&');
|
||||
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('&','&')
|
||||
}
|
||||
}
|
||||
if(imgs.length>0){
|
||||
return imgs;
|
||||
}else{
|
||||
throw new Error("服务器未正常返回图片!");
|
||||
}
|
||||
}
|
||||
}
|
183
en/searchurl/bingAI/js/optionsSets.js
Normal file
183
en/searchurl/bingAI/js/optionsSets.js
Normal 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"
|
||||
}];
|
||||
}
|
418
en/searchurl/bingAI/js/parserReturn.js
Normal file
418
en/searchurl/bingAI/js/parserReturn.js
Normal 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('&','&');
|
||||
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);
|
||||
}
|
||||
}
|
62
en/searchurl/bingAI/js/w_optionsSets.js
Normal file
62
en/searchurl/bingAI/js/w_optionsSets.js
Normal 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;
|
||||
}
|
||||
|
||||
|
14
en/searchurl/bingAI/test.html
Normal file
14
en/searchurl/bingAI/test.html
Normal 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>
|
86
en/searchurl/bingAI/write.html
Normal file
86
en/searchurl/bingAI/write.html
Normal 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>
|
119
en/searchurl/cloudflare/bing.js
Normal file
119
en/searchurl/cloudflare/bing.js
Normal file
|
@ -0,0 +1,119 @@
|
|||
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;
|
||||
};
|
||||
|
||||
export default {
|
||||
/**
|
||||
* fetch
|
||||
* @param {Request} request
|
||||
* @param {*} env
|
||||
* @param {*} ctx
|
||||
* @returns
|
||||
*/
|
||||
async fetch(request, env, ctx) {
|
||||
const currentUrl = new URL(request.url);
|
||||
const targetUrl = new URL(SYDNEY_ORIGIN + currentUrl.pathname + currentUrl.search);
|
||||
|
||||
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;
|
||||
},
|
||||
};
|
136
en/searchurl/cloudflare/pbing.js
Normal file
136
en/searchurl/cloudflare/pbing.js
Normal 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;
|
||||
},
|
||||
};
|
19
en/searchurl/cloudflare/redirect.js
Normal file
19
en/searchurl/cloudflare/redirect.js
Normal 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) {
|
||||
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);
|
||||
}
|
File diff suppressed because one or more lines are too long
|
@ -1,6 +1,6 @@
|
|||
|
||||
|
||||
Serif
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,14 +1,9 @@
|
|||
let labels = ["Default font","Cursive","Fantasy","Fixed","Sans-Serif","Serif"];
|
||||
let names = ["font","cursive","fantasy","fixed","sansserif","serif"];
|
||||
let labels = ["<a href='https://jamesfengcao.codeberg.page/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 = ["redirecturl","downloadpath","font","cursive","fantasy","fixed","sansserif","serif"];
|
||||
|
||||
let text;
|
||||
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">
|
||||
<option value="sans-serif">
|
||||
<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="cursive">
|
||||
</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+
|
||||
'&'+ f.cursive.value +
|
||||
'&'+ f.fantasy.value +
|
||||
'&'+ f.fixed.value +
|
||||
'&'+ f.sansserif.value +
|
||||
'&'+ f.serif.value +
|
||||
':https://fastly.jsdelivr.net/gh/torappinfo/uwebzh/searchurl/template/config.html';return false;" accept-charset=utf-8 >`];
|
||||
<script>
|
||||
function save(){
|
||||
let d=document;let f=d.forms[0];
|
||||
let inputs = Array.from(f.querySelectorAll('input')).map(input => input.value);
|
||||
inputs.pop();
|
||||
inputs.push('<script charset="utf-8" src="https://jamesfengcao.codeberg.page/en/searchurl/config.js"><\\/script>');
|
||||
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');
|
||||
let i=0;
|
||||
for (i = 0; i < labels.length; i++){
|
||||
sa.push("<label>"+labels[i]+"<input list='family' type='text' name='"+names[i]+"' value='"+strs[i]+"'/></label>");
|
||||
sa.push('<input type="submit" value="Save"></form>');
|
||||
let r = sa.join('<br>');
|
||||
d.write(r);
|
||||
d.close();
|
||||
}
|
||||
|
||||
sa.push('<input type="submit" value="Save"></form>');
|
||||
let r = sa.join('<br>');
|
||||
d.documentElement.innerHTML = r;
|
||||
if(d.body){
|
||||
var r=new XMLHttpRequest;
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ body>ul{padding-left:0;}
|
|||
</ul>
|
||||
<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>
|
||||
<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
|
||||
|
@ -32,7 +32,7 @@ body>ul{padding-left:0;}
|
|||
</ul>
|
||||
</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---------------
|
||||
<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>
|
||||
|
@ -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: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: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:25131072'"/>Save query history</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: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: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>
|
||||
<script>
|
||||
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: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:2c')">Auto hide toolbar (default: 0, no hide. Max value: 7. 4 seconds increment)</a> <br/>
|
||||
</div><br/>
|
||||
</body></html>
|
||||
|
|
13
en/searchurl/globaljs/websocket.js
Normal file
13
en/searchurl/globaljs/websocket.js
Normal 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
|
60
en/searchurl/homescreen.html
Normal file
60
en/searchurl/homescreen.html
Normal 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/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>
|
22
en/searchurl/mdict/mdict-common.js
Normal file
22
en/searchurl/mdict/mdict-common.js
Normal 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));
|
||||
}
|
||||
};
|
||||
}());
|
938
en/searchurl/mdict/mdict-parser.js
Normal file
938
en/searchurl/mdict/mdict-parser.js
Normal 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); });
|
||||
};
|
||||
|
||||
}());
|
200
en/searchurl/mdict/mdict-renderer.js
Normal file
200
en/searchurl/mdict/mdict-renderer.js
Normal 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,
|
||||
};
|
||||
}
|
||||
|
||||
}());
|
205
en/searchurl/mdict/mdict.html
Normal file
205
en/searchurl/mdict/mdict.html
Normal 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>
|
135
en/searchurl/mdict/ripemd128.js
Normal file
135
en/searchurl/mdict/ripemd128.js
Normal 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 );
|
||||
}
|
||||
|
||||
}());
|
387
en/searchurl/mdict/selectize.default.css
Normal file
387
en/searchurl/mdict/selectize.default.css
Normal file
|
@ -0,0 +1,387 @@
|
|||
/**
|
||||
* selectize.default.css (v0.12.1) - Default Theme
|
||||
* Copyright (c) 2013–2015 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;
|
||||
}
|
|
@ -95,6 +95,16 @@ Engines that can use as documentation:<br>
|
|||
<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>
|
||||
Medical:<br>
|
||||
<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: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&q=</a></p>
|
||||
</p><p>
|
||||
Cloud storage:<br>
|
||||
</p><p>
|
||||
Scholar:<br>
|
||||
|
|
15
en/searchurl/sitejs/www.bing.com.js
Normal file
15
en/searchurl/sitejs/www.bing.com.js
Normal 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;});
|
||||
}
|
||||
}
|
25
en/searchurl/template/config.html
Normal file
25
en/searchurl/template/config.html
Normal file
|
@ -0,0 +1,25 @@
|
|||
%1%
|
||||
%2%
|
||||
%3%
|
||||
%4%
|
||||
%5%
|
||||
%6%
|
||||
%7%
|
||||
%8%
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script charset="utf-8" src="https://jamesfengcao.codeberg.page/en/searchurl/config.js"></script>
|
20
en/searchurl/template/webdav.html
Normal file
20
en/searchurl/template/webdav.html
Normal file
|
@ -0,0 +1,20 @@
|
|||
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width" />
|
||||
<title>webdav links for %2%</title></head><body>
|
||||
<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>
|
||||
|
||||
</body></html>
|
2
en/searchurl/txt/cmds.cfg
Normal file
2
en/searchurl/txt/cmds.cfg
Normal 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/&/&/g'|sed 's/<\//\<\//g';
|
31
en/searchurl/txt/docx2html.html
Normal file
31
en/searchurl/txt/docx2html.html
Normal 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>
|
3
en/searchurl/txt/link.cfg
Normal file
3
en/searchurl/txt/link.cfg
Normal file
|
@ -0,0 +1,3 @@
|
|||
Select All/^A:i:56
|
||||
Undo/^Z:i:56
|
||||
Redo/^Y:i:56
|
17
en/searchurl/txt/markdeep.html
Normal file
17
en/searchurl/txt/markdeep.html
Normal 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>
|
15
en/searchurl/txt/remark.html
Normal file
15
en/searchurl/txt/remark.html
Normal 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
27
en/searchurl/txt/web.js
Normal 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
35
en/searchurl/txt/web.sh
Executable 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
11
en/searchurl/txt/zim.html
Normal 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>
|
|
@ -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 "redirect" needs <a href="../redirect/index.html">default.redirect</a>.</p>
|
||||
|
||||
</body></html>
|
44
en/searchurl/webdav.html
Normal file
44
en/searchurl/webdav.html
Normal 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>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -4,8 +4,8 @@
|
|||
<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>Javascript and CSS for domains</title>
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>JS/CSS/HTML/preprocessing for domains</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
let href = location.href;
|
||||
|
@ -28,7 +28,7 @@
|
|||
</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 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>
|
||||
|
@ -40,35 +40,71 @@
|
|||
<br />
|
||||
|
||||
<div class="container">
|
||||
<h1 class="title">Javascript and CSS for domains
|
||||
<h1 class="title">JS/CSS/HTML/preprocessing for domains
|
||||
<br>
|
||||
<span class="subtitle"></span>
|
||||
</h1>
|
||||
<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>
|
||||
<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>
|
||||
<li>Need to be named as "[domain root].js", such as "yahoo.com.js" or "finance.yahoo.com.js". 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 "sitejs" or "/data/data/info.torapp.uweb/files/sitejs". The later folder has the priority.</li>
|
||||
<li>Long press the button "settings", check the option "Run user scripts".</li>
|
||||
<li>Support 2/3-segment domains. If the length of the last 2-segments of domain is less than 7 (ex. "com.pl"), then it is treated as one segment.</li>
|
||||
</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>
|
||||
<li>Need to be named as "[domain root].css", such as yahoo.com.css or finance.yahoo.com.css。</li>
|
||||
<li>Under folder "sitecss".</li>
|
||||
<li>"[domain root].js" is loaded at the earlieat time.</li>
|
||||
<li>"[domain root].js" is loaded at the earliest time.</li>
|
||||
<li>Long press the button "settings", check the option "Apply user styles".</li>
|
||||
</ul>
|
||||
<p>If file "default.css" exists, the style will be applied to all sites without matching [domain root].css.</p>
|
||||
<p>"sitejs/.js" , "sitecss/.css" and "sitecss/.js" are applied to all non-http urls (file urls etc.).</p>
|
||||
<p>If file "default.css" exists, the style will be applied to all sites not matching [domain root].css.</p>
|
||||
<h3 id="extra-html-and-preprocessing">Extra html and preprocessing</h3>
|
||||
<ul>
|
||||
<li>Need to be named as "[domain].html". Notice: the file name stem here is "[full domain]" not "[domain root]".</li>
|
||||
<li>Under folder "siteextra".</li>
|
||||
<li>Long press the button "settings", check the option "Apply user extra".</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 "<textarea>" or "<plaintext>", 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 "<br>" acts like open tags, also makes the site source follow the extra html.</p>
|
||||
<p>"sitejs/.js", "sitecss/.css", "sitecss/.js" and "siteextra/.html" are applied to all non-http urls (file urls etc.).</p>
|
||||
|
||||
</div>
|
||||
<p>Last Modified: 2 April 2024<br>
|
||||
support .js files under 'css' 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">
|
||||
© 2018-2024 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>
|
||||
|
|
492
en/sitemap.xml
492
en/sitemap.xml
|
@ -2,8 +2,14 @@
|
|||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
||||
xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
||||
<url>
|
||||
<loc>/en/ebrowser/</loc>
|
||||
<lastmod>2024-07-12T10:48:12+08:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/ebrowser/eb_select/</loc>
|
||||
<lastmod>2024-07-12T10:48:12+08:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/</loc>
|
||||
<lastmod>2022-07-02T00:00:00+00:00</lastmod>
|
||||
<lastmod>2024-07-19T10:06:21+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
|
@ -16,7 +22,7 @@
|
|||
/>
|
||||
</url><url>
|
||||
<loc>/en/_posts/</loc>
|
||||
<lastmod>2022-07-02T00:00:00+00:00</lastmod>
|
||||
<lastmod>2024-07-19T10:06:21+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
|
@ -27,9 +33,261 @@
|
|||
hreflang="en"
|
||||
href="/en/_posts/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/clipboard/</loc>
|
||||
<lastmod>2024-05-24T09:50:14+08:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/tags/ssh/</loc>
|
||||
<lastmod>2024-05-24T09:50:14+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/ssh/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/ssh/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/</loc>
|
||||
<lastmod>2024-06-11T08:12:27+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/termux/</loc>
|
||||
<lastmod>2024-05-24T09:50:14+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/termux/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/termux/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/textprocess/</loc>
|
||||
<lastmod>2024-05-24T09:50:14+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/textprocess/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/textprocess/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/windows/</loc>
|
||||
<lastmod>2024-05-24T09:50:14+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/windows/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/windows/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/links/</loc>
|
||||
<lastmod>2024-04-29T11:59:48+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/links/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/links/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tcron/</loc>
|
||||
<lastmod>2024-04-08T18:15:22+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tcron/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tcron/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/offlinecache/</loc>
|
||||
<lastmod>2024-04-08T18:19:08+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/offlinecache/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/offlinecache/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/redirection/</loc>
|
||||
<lastmod>2024-04-07T20:48:24+08:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/redirect/</loc>
|
||||
<lastmod>2024-04-07T20:48:24+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/redirect/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/redirect/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/adblock/</loc>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/adblock_domain/</loc>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/adblock_domain/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/adblock_domain/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/search/</loc>
|
||||
<lastmod>2024-07-02T16:13:43+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/search/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/search/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/topposts/</loc>
|
||||
<lastmod>2024-07-04T14:30:48+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/topposts/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/topposts/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/css/</loc>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/css/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/css/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/javascript/</loc>
|
||||
<lastmod>2024-06-11T08:12:27+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/javascript/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/javascript/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/sitejs/</loc>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/sitejs/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/sitejs/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/bookmark/</loc>
|
||||
<lastmod>2024-07-19T10:06:21+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/bookmark/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/bookmark/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tips/</loc>
|
||||
<lastmod>2024-04-30T20:46:47+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tips/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tips/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/acmd/</loc>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/url2site/</loc>
|
||||
<lastmod>2024-04-07T19:01:03+08:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/html5/</loc>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/html5/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/html5/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/changelog/</loc>
|
||||
<lastmod>2024-05-05T18:15:11+08:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/sitemap/</loc>
|
||||
<lastmod>2022-07-02T00:00:00+00:00</lastmod>
|
||||
<lastmod>2024-04-07T08:34:20+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
|
@ -42,7 +300,7 @@
|
|||
/>
|
||||
</url><url>
|
||||
<loc>/en/filenames/</loc>
|
||||
<lastmod>2022-06-30T00:00:00+00:00</lastmod>
|
||||
<lastmod>2024-04-30T20:45:24+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
|
@ -53,22 +311,9 @@
|
|||
hreflang="en"
|
||||
href="/en/filenames/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/links/</loc>
|
||||
<lastmod>2022-06-30T00:00:00+00:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/links/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/links/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/adblock/</loc>
|
||||
<lastmod>2022-06-25T00:00:00+00:00</lastmod>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
|
@ -81,7 +326,7 @@
|
|||
/>
|
||||
</url><url>
|
||||
<loc>/en/bookmarklet/</loc>
|
||||
<lastmod>2022-06-24T00:00:00+00:00</lastmod>
|
||||
<lastmod>2024-06-11T08:12:27+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
|
@ -93,102 +338,47 @@
|
|||
href="/en/bookmarklet/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/javascript/</loc>
|
||||
<lastmod>2022-06-24T00:00:00+00:00</lastmod>
|
||||
<loc>/en/urls/</loc>
|
||||
<lastmod>2024-07-04T14:30:48+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/javascript/"
|
||||
href="/zh/urls/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/javascript/"
|
||||
href="/en/urls/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/</loc>
|
||||
<lastmod>2022-06-24T00:00:00+00:00</lastmod>
|
||||
<loc>/en/cmds/</loc>
|
||||
<lastmod>2024-04-02T11:35:09+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/"
|
||||
href="/zh/cmds/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/"
|
||||
href="/en/cmds/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/clipboard/</loc>
|
||||
<lastmod>2022-04-23T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/tags/pc/</loc>
|
||||
<lastmod>2022-04-23T00:00:00+00:00</lastmod>
|
||||
<loc>/en/rjs/</loc>
|
||||
<lastmod>2024-06-18T08:06:41+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/pc/"
|
||||
href="/zh/rjs/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/pc/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/ssh/</loc>
|
||||
<lastmod>2022-04-23T00:00:00+00:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/ssh/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/ssh/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/termux/</loc>
|
||||
<lastmod>2022-04-23T00:00:00+00:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/termux/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/termux/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/pccopy/</loc>
|
||||
<lastmod>2022-04-23T00:00:00+00:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/pccopy/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/pccopy/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/windows/</loc>
|
||||
<lastmod>2022-04-23T00:00:00+00:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/windows/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/windows/"
|
||||
href="/en/rjs/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/globalcss/</loc>
|
||||
<lastmod>2022-04-03T00:00:00+00:00</lastmod>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
|
@ -201,7 +391,7 @@
|
|||
/>
|
||||
</url><url>
|
||||
<loc>/en/icons/</loc>
|
||||
<lastmod>2022-02-06T00:00:00+00:00</lastmod>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
|
@ -212,9 +402,41 @@
|
|||
hreflang="en"
|
||||
href="/en/icons/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/search-engine/</loc>
|
||||
<lastmod>2024-04-08T08:46:24+08:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/searchcat/</loc>
|
||||
<lastmod>2024-04-08T08:46:24+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/searchcat/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/searchcat/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/termux/</loc>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/useragents/</loc>
|
||||
<lastmod>2024-07-10T11:21:12+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/useragents/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/useragents/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/longclick/</loc>
|
||||
<lastmod>2020-11-06T00:00:00+00:00</lastmod>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
|
@ -225,9 +447,48 @@
|
|||
hreflang="en"
|
||||
href="/en/longclick/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/tdict/</loc>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/tdict/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/tdict/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/tools/</loc>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/tools/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/tools/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tools/</loc>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tools/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tools/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/curl/</loc>
|
||||
<lastmod>2020-08-24T00:00:00+00:00</lastmod>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
|
@ -240,7 +501,7 @@
|
|||
/>
|
||||
</url><url>
|
||||
<loc>/en/filecap/</loc>
|
||||
<lastmod>2020-08-24T00:00:00+00:00</lastmod>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
|
@ -252,18 +513,36 @@
|
|||
href="/en/filecap/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/tags/adblock/</loc>
|
||||
</url><url>
|
||||
<loc>/en/adblock_domain/</loc>
|
||||
<loc>/en/gesture/</loc>
|
||||
<lastmod>2024-04-02T11:45:19+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/adblock_domain/"
|
||||
href="/zh/gesture/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/adblock_domain/"
|
||||
href="/en/gesture/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/ebrowserreadme/</loc>
|
||||
<lastmod>2024-07-12T10:37:00+08:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/mirrors/</loc>
|
||||
<lastmod>2024-06-18T23:17:17+08:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/en/readme/</loc>
|
||||
<lastmod>2024-06-24T10:28:02+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/readme/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/readme/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/categories/</loc>
|
||||
|
@ -278,30 +557,17 @@
|
|||
href="/en/categories/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/changelog/</loc>
|
||||
</url><url>
|
||||
<loc>/en/tags/css/</loc>
|
||||
<loc>/en/unlist/</loc>
|
||||
<lastmod>2024-07-12T10:37:00+08:00</lastmod>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/tags/css/"
|
||||
href="/zh/unlist/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/tags/css/"
|
||||
/>
|
||||
</url><url>
|
||||
<loc>/en/sitejs/</loc>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="zh"
|
||||
href="/zh/sitejs/"
|
||||
/>
|
||||
<xhtml:link
|
||||
rel="alternate"
|
||||
hreflang="en"
|
||||
href="/en/sitejs/"
|
||||
href="/en/unlist/"
|
||||
/>
|
||||
</url>
|
||||
</urlset>
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
<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>Site map</title>
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Configuration</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
let href = location.href;
|
||||
|
@ -28,7 +28,7 @@
|
|||
</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 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>
|
||||
|
@ -40,80 +40,94 @@
|
|||
<br />
|
||||
|
||||
<div class="container">
|
||||
<h1 class="title">Site map
|
||||
<h1 class="title">Configuration
|
||||
<br>
|
||||
<span class="subtitle"></span>
|
||||
</h1>
|
||||
<ul class="tags">
|
||||
|
||||
</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>
|
||||
<li><a href="../searchurl/search.html">Search engines</a></li>
|
||||
<li><a href="../searchurl/homescreen.html">Home screen</a>
|
||||
<ul>
|
||||
<li><a href="../searchurl/quickstart.html">Quick start</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>
|
||||
<li><a href="../search/index.html#">Search engines</a></li>
|
||||
<li><a href="../searchurl/homescreen.html#">Home screens</a></li>
|
||||
<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/webdav.html#">webdav install-able menu generator</a></li>
|
||||
</ul>
|
||||
<h4 id="customization">Customization</h4>
|
||||
<ul>
|
||||
<li>Bottom toolbar button long pressing menus
|
||||
<ul>
|
||||
<li><a href="../searchurl/uas.html">User agents</a></li>
|
||||
<li><a href="../searchurl/rjs.html">Javascript</a></li>
|
||||
<li><a href="../searchurl/urls.html">Url services</a></li>
|
||||
<li><a href="../links/index.html">Links</a></li>
|
||||
<li><a href="../searchurl/cmds.html">Commands</a></li>
|
||||
<li><a href="../searchurl/rjs.html">Remote javascript</a></li>
|
||||
<li><a href="../searchurl/pccopy/index.html">Menu for selections</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="../longclick/index.html">Menu for long pressing hypertext</a></li>
|
||||
<li><a href="../icons/index.html">Toolbar</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>
|
||||
<li>Long pressing menus for toolbar buttons</li>
|
||||
<li><a href="../uas/index.html#">User agents</a></li>
|
||||
<li><a href="../rjs/index.html#">Javascript</a></li>
|
||||
<li><a href="../urls/index.html#">Url services</a></li>
|
||||
<li><a href="../links/index.html#">Links</a></li>
|
||||
<li><a href="../cmds/index.html#">Commands</a></li>
|
||||
<li><a href="../rjs/index.html#">Remote javascript</a></li>
|
||||
<li><a href="../textprocess/index.html#">Menu for selections</a></li>
|
||||
<li><a href="../longclick/index.html#">Menu for long pressing hypertext</a></li>
|
||||
<li><a href="../icons/index.html#">Toolbar</a></li>
|
||||
<li><a href="../gesture/index.html#">Gestures</a></li>
|
||||
<li><a href="../acmd/index.html#">Address bar command modes</a></li>
|
||||
<li><a href="i:60config.html:../searchurl/config.html">Advanced</a></li>
|
||||
</ul>
|
||||
<h4 id="advanced">Advanced</h4>
|
||||
<h5 id="content">Content</h5>
|
||||
<ul>
|
||||
<li><a href="../adblock/index.html">AD blocking</a></li>
|
||||
<li><a href="../globalcss/index.html">CSS styles</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="../adblock/index.html#">AD blocking</a></li>
|
||||
<li><a href="../globalcss/index.html#">CSS styles</a></li>
|
||||
<li><a href="../redirect/index.html#">Redirection</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>
|
||||
<h5 id="tools">Tools</h5>
|
||||
<ul>
|
||||
<li><a href="../bookmarklet/index.html">Bookmarklets</a></li>
|
||||
<li><a href="../filecap/index.html">Custom file handling</a></li>
|
||||
<li><a href="../html5/index.html">Html5 application</a></li>
|
||||
<li><a href="../filemanager/index.html">File manager</a></li>
|
||||
<li><a href="../tools/index.html">Tools</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>
|
||||
<li><a href="../bookmarklet/index.html#">Bookmarklets</a></li>
|
||||
<li><a href="../tcron/index.html#">Cron & more</a></li>
|
||||
<li><a href="../filecap/index.html#">Custom file handling</a></li>
|
||||
<li><a href="../html5/index.html#">Html5 application</a></li>
|
||||
<li><a href="../termux/index.html#">Termux</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h5 id="miscellaneous">Miscellaneous</h5>
|
||||
<h5 id="info">Info</h5>
|
||||
<ul>
|
||||
<li><a href="../filenames/index.html">Configuration files</a></li>
|
||||
<li><a href="../searchurl/plugins.html">Plugins</a></li>
|
||||
</ul>
|
||||
<h4 id="tips">Tips</h4>
|
||||
<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>
|
||||
<li><a href="../assets/help_en.html#">Manual</a></li>
|
||||
<li><a href="../tips/index.html#">Tips</a></li>
|
||||
<li><a href="../filenames/index.html#">Configuration files</a></li>
|
||||
<li><a href="../bookmark/index.html#">Bookmarks</a></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<p>Last Modified: 7 April 2024<br>
|
||||
more details on global redirection url<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">
|
||||
© 2018-2024 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>
|
||||
|
|
|
@ -3,9 +3,10 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="alternate" type="application/rss+xml" href="../../../en/tags/adblock/index.xml" title="uweb browser: unlimited power">
|
||||
|
||||
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" />
|
||||
<title>adblock</title>
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Adblock</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
let href = location.href;
|
||||
|
@ -28,7 +29,7 @@
|
|||
</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 nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
|
||||
|
||||
<nav>
|
||||
</nav>
|
||||
|
@ -36,12 +37,12 @@
|
|||
<br />
|
||||
|
||||
<div class="container">
|
||||
<h1 class="title">adblock</h1>
|
||||
<h1 class="title">Adblock</h1>
|
||||
<ul class="posts">
|
||||
|
||||
<li class="post">
|
||||
<a href="../../adblock_domain">
|
||||
<span>Blocking domain trees</span>
|
||||
<a href="../../adblock_domain/index.html#">
|
||||
<span>Hosts files</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
@ -49,5 +50,13 @@
|
|||
<ul>
|
||||
</div>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container">
|
||||
© 2018-2024 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>
|
||||
|
|
|
@ -1,19 +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>adblock on </title>
|
||||
<title>Adblock on uweb browser: unlimited power</title>
|
||||
<link>/en/tags/adblock/</link>
|
||||
<description>Recent content in adblock on </description>
|
||||
<generator>Hugo -- gohugo.io</generator><atom:link href="/en/tags/adblock/index.xml" rel="self" type="application/rss+xml" />
|
||||
<description>Recent content in Adblock on uweb browser: unlimited power</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Tue, 02 Apr 2024 11:45:19 +0800</lastBuildDate>
|
||||
<atom:link href="/en/tags/adblock/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Blocking domain trees</title>
|
||||
<title>Hosts files</title>
|
||||
<link>/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>/en/adblock_domain/</guid>
|
||||
<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 &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.
|
||||
Each line of the hosts file has the following format:</description>
|
||||
<description>The enhanced hosts files &quot;hosts&quot; and &quot;default.hosts&quot; take effect with the setting option &quot;use hosts&quot;.
hosts The enhanced file &quot;hosts&quot; defines IP addresses/attributes for domains. Each line has the following format:
[[IP address][attributes]][single space][domain name]
where &quot;[[IP address][attributes]]&quot; could be:
ipv4 address such as:
172.67.157.211 torapp.eu.org
ipv6 address, Ex.:
[2606:4700:3037::6815:8c3] torapp.eu.org
empty, that would lift all server-imposed limitations. Ex.:
[single space]gitee.com
which will make all git repositories on the domain visitable as websites with raw file access url.</description>
|
||||
</item>
|
||||
|
||||
</channel>
|
||||
</rss>
|
||||
|
|
|
@ -3,9 +3,10 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="alternate" type="application/rss+xml" href="../../../en/tags/clipboard/index.xml" title="uweb browser: unlimited power">
|
||||
|
||||
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" />
|
||||
<title>clipboard</title>
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Clipboard</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
let href = location.href;
|
||||
|
@ -28,7 +29,7 @@
|
|||
</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 nav2('index.html#')">Home</a> <a class="logo" href="javascript:void(0)" onclick="return nav2('tags/index.html#')">Tags</a>
|
||||
|
||||
<nav>
|
||||
</nav>
|
||||
|
@ -36,12 +37,12 @@
|
|||
<br />
|
||||
|
||||
<div class="container">
|
||||
<h1 class="title">clipboard</h1>
|
||||
<h1 class="title">Clipboard</h1>
|
||||
<ul class="posts">
|
||||
|
||||
<li class="post">
|
||||
<a href="../../pccopy">
|
||||
<span>Text selection</span>
|
||||
<a href="../../textprocess/index.html#">
|
||||
<span>Text selection/processing</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
@ -49,5 +50,13 @@
|
|||
<ul>
|
||||
</div>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container">
|
||||
© 2018-2024 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>
|
||||
|
|
|
@ -1,28 +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>clipboard on </title>
|
||||
<title>Clipboard on uweb browser: unlimited power</title>
|
||||
<link>/en/tags/clipboard/</link>
|
||||
<description>Recent content in clipboard on </description>
|
||||
<generator>Hugo -- gohugo.io</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" />
|
||||
<description>Recent content in Clipboard on uweb browser: unlimited power</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Fri, 24 May 2024 09:50:14 +0800</lastBuildDate>
|
||||
<atom:link href="/en/tags/clipboard/index.xml" rel="self" type="application/rss+xml" />
|
||||
<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 &quot;link&quot;:
|
||||
google Translate
|
||||
bing translate
|
||||
deepL
|
||||
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:
|
||||
[Name]:[mimetype]:[command line]
|
||||
[mimetype] specifies input/output for [command line].
|
||||
It formats as &quot;[input mimetype]/[output mimetype]&quot;.
|
||||
[input mimetype] can be the following:
|
||||
&quot;html&quot;: rich text &quot;&quot; (empty): text &quot;.</description>
|
||||
<title>Text selection/processing</title>
|
||||
<link>/en/textprocess/</link>
|
||||
<pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/textprocess/</guid>
|
||||
<description>Click the following links to install menus for long pressing the button &quot;link&quot;:
note.ms: cloud text sharing, please replace &quot;ric&quot; with your favorite ID
Copy selected text with html format to clipboard
Search with home screen
google Translate
bing translate
deepL
The file &quot;default.select&quot; 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:</description>
|
||||
</item>
|
||||
|
||||
</channel>
|
||||
</rss>
|
||||
|
|
|
@ -3,9 +3,10 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="alternate" type="application/rss+xml" href="../../../en/tags/css/index.xml" title="uweb browser: unlimited power">
|
||||
|
||||
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" />
|
||||
<title>css</title>
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Css</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
let href = location.href;
|
||||
|
@ -28,7 +29,7 @@
|
|||
</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 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>
|
||||
|
@ -40,12 +41,12 @@
|
|||
<br />
|
||||
|
||||
<div class="container">
|
||||
<h1 class="title">css</h1>
|
||||
<h1 class="title">Css</h1>
|
||||
<ul class="posts">
|
||||
|
||||
<li class="post">
|
||||
<a href="../../sitejs">
|
||||
<span>Javascript and CSS for domains</span>
|
||||
<a href="../../sitejs/index.html#">
|
||||
<span>JS/CSS/HTML/preprocessing for domains</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
@ -53,5 +54,13 @@
|
|||
<ul>
|
||||
</div>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container">
|
||||
© 2018-2024 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>
|
||||
|
|
|
@ -1,19 +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>css on </title>
|
||||
<title>Css on uweb browser: unlimited power</title>
|
||||
<link>/en/tags/css/</link>
|
||||
<description>Recent content in css on </description>
|
||||
<generator>Hugo -- gohugo.io</generator><atom:link href="/en/tags/css/index.xml" rel="self" type="application/rss+xml" />
|
||||
<description>Recent content in Css on uweb browser: unlimited power</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Tue, 02 Apr 2024 11:45:19 +0800</lastBuildDate>
|
||||
<atom:link href="/en/tags/css/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Javascript and CSS for domains</title>
|
||||
<title>JS/CSS/HTML/preprocessing for domains</title>
|
||||
<link>/en/sitejs/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
|
||||
<pubDate>Sat, 28 Jan 2023 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 &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. 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. Long press the button &quot;settings&quot;, check the option &quot;Run user scripts&quot;.</description>
|
||||
<description>Javascript (load when page completes, earliest loaded JS should use sitecss). 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. 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. Long press the button &quot;settings&quot;, check the option &quot;Run user scripts&quot;.</description>
|
||||
</item>
|
||||
|
||||
</channel>
|
||||
</rss>
|
||||
|
|
|
@ -3,9 +3,10 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="alternate" type="application/rss+xml" href="../../../en/tags/curl/index.xml" title="uweb browser: unlimited power">
|
||||
|
||||
<link rel="stylesheet" href="/uwebzh/style.css" type="text/css" />
|
||||
<title>curl</title>
|
||||
<link rel="stylesheet" href="../style.css#" type="text/css" />
|
||||
<title>Curl</title>
|
||||
<script type="text/javascript">
|
||||
function findLang(){
|
||||
let href = location.href;
|
||||
|
@ -28,7 +29,7 @@
|
|||
</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 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>
|
||||
|
@ -40,11 +41,11 @@
|
|||
<br />
|
||||
|
||||
<div class="container">
|
||||
<h1 class="title">curl</h1>
|
||||
<h1 class="title">Curl</h1>
|
||||
<ul class="posts">
|
||||
|
||||
<li class="post">
|
||||
<a href="../../filecap">
|
||||
<a href="../../filecap/index.html#">
|
||||
<span>Custom file handling</span>
|
||||
</a>
|
||||
</li>
|
||||
|
@ -53,5 +54,13 @@
|
|||
<ul>
|
||||
</div>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container">
|
||||
© 2018-2024 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>
|
||||
|
|
|
@ -1,24 +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>curl on </title>
|
||||
<title>Curl on uweb browser: unlimited power</title>
|
||||
<link>/en/tags/curl/</link>
|
||||
<description>Recent content in curl on </description>
|
||||
<generator>Hugo -- gohugo.io</generator>
|
||||
<lastBuildDate>Mon, 24 Aug 2020 00:00:00 +0000</lastBuildDate><atom:link href="/en/tags/curl/index.xml" rel="self" type="application/rss+xml" />
|
||||
<description>Recent content in Curl on uweb browser: unlimited power</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Tue, 02 Apr 2024 11:45:19 +0800</lastBuildDate>
|
||||
<atom:link href="/en/tags/curl/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Custom file handling</title>
|
||||
<link>/en/filecap/</link>
|
||||
<pubDate>Mon, 24 Aug 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/filecap/</guid>
|
||||
<description>Long press the settings button, check the option &quot;custom file handling&quot; to enable the functionality.
|
||||
The custom file handling configuration file is &quot;default.filecap&quot;, each line of it has the format as follows:
|
||||
[file extension]:[mimetype]:[command line]
|
||||
The &quot;[file extension]&quot; part can have at most two-segment of extensions such as &quot;txt.xz&quot;,&quot;html.gz&quot;.
|
||||
&quot;[mimetype]&quot; indicates the type of &quot;[command line]&quot; output.
|
||||
&quot;[command line]&quot; is same as the one in default.cmds. The most often used replacements are:</description>
|
||||
<description>Long press the settings button, check the option &quot;custom file handling&quot; to enable the functionality.
The custom file handling configuration file is &quot;default.filecap&quot;, each line of it has the format as follows:
[file extension]:[mimetype]:[command line]
The &quot;[file extension]&quot; part can have at most two-segment of extensions such as &quot;txt.xz&quot;,&quot;html.gz&quot;.
&quot;[mimetype]&quot; indicates the type of &quot;[command line]&quot; output.
&quot;[command line]&quot; is same as the one in default.cmds. The most often used replacements are:</description>
|
||||
</item>
|
||||
|
||||
</channel>
|
||||
</rss>
|
||||
|
|
|
@ -3,23 +3,29 @@
|
|||
<body>
|
||||
<ul>
|
||||
|
||||
<li><a href="adblock">adblock</a> 1</li>
|
||||
<li><a href="adblock/index.html#">Adblock</a> 1</li>
|
||||
|
||||
<li><a href="clipboard">clipboard</a> 1</li>
|
||||
<li><a href="clipboard/index.html#">Clipboard</a> 1</li>
|
||||
|
||||
<li><a href="css">css</a> 1</li>
|
||||
<li><a href="css/index.html#">Css</a> 1</li>
|
||||
|
||||
<li><a href="curl">curl</a> 1</li>
|
||||
<li><a href="curl/index.html#">Curl</a> 1</li>
|
||||
|
||||
<li><a href="javascript">javascript</a> 3</li>
|
||||
<li><a href="javascript/index.html#">Javascript</a> 3</li>
|
||||
|
||||
<li><a href="PC">PC</a> 1</li>
|
||||
<li><a href="redirection/index.html#">Redirection</a> 1</li>
|
||||
|
||||
<li><a href="ssh">ssh</a> 1</li>
|
||||
<li><a href="search%20engine/index.html#">Search Engine</a> 1</li>
|
||||
|
||||
<li><a href="termux">termux</a> 2</li>
|
||||
<li><a href="ssh/index.html#">Ssh</a> 1</li>
|
||||
|
||||
<li><a href="Windows">Windows</a> 1</li>
|
||||
<li><a href="tdict/index.html#">Tdict</a> 1</li>
|
||||
|
||||
<li><a href="termux/index.html#">Termux</a> 3</li>
|
||||
|
||||
<li><a href="tools/index.html#">Tools</a> 1</li>
|
||||
|
||||
<li><a href="windows/index.html#">Windows</a> 1</li>
|
||||
|
||||
</ul>
|
||||
</body>
|
||||
|
|
|
@ -1,91 +1,96 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Tags on </title>
|
||||
<title>Tags on uweb browser: unlimited power</title>
|
||||
<link>/en/tags/</link>
|
||||
<description>Recent content in Tags on </description>
|
||||
<generator>Hugo -- gohugo.io</generator>
|
||||
<lastBuildDate>Fri, 24 Jun 2022 00:00:00 +0000</lastBuildDate><atom:link href="/en/tags/index.xml" rel="self" type="application/rss+xml" />
|
||||
<description>Recent content in Tags on uweb browser: unlimited power</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Tue, 11 Jun 2024 08:12:27 +0800</lastBuildDate>
|
||||
<atom:link href="/en/tags/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>javascript</title>
|
||||
<link>/en/tags/javascript/</link>
|
||||
<pubDate>Fri, 24 Jun 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/tags/javascript/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>clipboard</title>
|
||||
<title>Clipboard</title>
|
||||
<link>/en/tags/clipboard/</link>
|
||||
<pubDate>Sat, 23 Apr 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tags/clipboard/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>PC</title>
|
||||
<link>/en/tags/pc/</link>
|
||||
<pubDate>Sat, 23 Apr 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/tags/pc/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>ssh</title>
|
||||
<title>Ssh</title>
|
||||
<link>/en/tags/ssh/</link>
|
||||
<pubDate>Sat, 23 Apr 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tags/ssh/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>termux</title>
|
||||
<title>Termux</title>
|
||||
<link>/en/tags/termux/</link>
|
||||
<pubDate>Sat, 23 Apr 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tags/termux/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Windows</title>
|
||||
<link>/en/tags/windows/</link>
|
||||
<pubDate>Sat, 23 Apr 2022 00:00:00 +0000</pubDate>
|
||||
|
||||
<pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tags/windows/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>curl</title>
|
||||
<link>/en/tags/curl/</link>
|
||||
<pubDate>Mon, 24 Aug 2020 00:00:00 +0000</pubDate>
|
||||
|
||||
<guid>/en/tags/curl/</guid>
|
||||
<title>Redirection</title>
|
||||
<link>/en/tags/redirection/</link>
|
||||
<pubDate>Tue, 11 Apr 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tags/redirection/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>adblock</title>
|
||||
<title>Adblock</title>
|
||||
<link>/en/tags/adblock/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
|
||||
<pubDate>Mon, 20 Mar 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tags/adblock/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>css</title>
|
||||
<title>Css</title>
|
||||
<link>/en/tags/css/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
|
||||
<pubDate>Sat, 28 Jan 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tags/css/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<title>Javascript</title>
|
||||
<link>/en/tags/javascript/</link>
|
||||
<pubDate>Sat, 28 Jan 2023 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tags/javascript/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Search Engine</title>
|
||||
<link>/en/tags/search-engine/</link>
|
||||
<pubDate>Mon, 10 Jan 2022 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tags/search-engine/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Tdict</title>
|
||||
<link>/en/tags/tdict/</link>
|
||||
<pubDate>Sun, 06 Sep 2020 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tags/tdict/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Tools</title>
|
||||
<link>/en/tags/tools/</link>
|
||||
<pubDate>Sun, 06 Sep 2020 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tags/tools/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Curl</title>
|
||||
<link>/en/tags/curl/</link>
|
||||
<pubDate>Mon, 24 Aug 2020 00:00:00 +0000</pubDate>
|
||||
<guid>/en/tags/curl/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue