add md+katex huge txt viewer

master
James Feng Cao 2 years ago
parent 1ca754c378
commit 3cb1a66d80

@ -15,6 +15,7 @@
<description>This page is for uweb browser. <description>This page is for uweb browser.
Click to install the following html5 apps: Click to install the following html5 apps:
Huge markdown file viewer Huge markdown file viewer
Huge markdown+katex file viewer (Tex formulas)
Huge markdeep file viewer (markdown, latex, diagram,graphviz etc.) Huge markdeep file viewer (markdown, latex, diagram,graphviz etc.)
plyr video player plyr video player
dplayer video player dplayer video player

@ -50,6 +50,7 @@
<p>This page is for <a href="../index.html">uweb browser</a>.<br> <p>This page is for <a href="../index.html">uweb browser</a>.<br>
Click to install the following html5 apps:<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/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/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/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/dplayer.html:../../zh/searchurl/txt/dplayer.html">dplayer video player</a><br>

@ -15,6 +15,7 @@
<description>This page is for uweb browser. <description>This page is for uweb browser.
Click to install the following html5 apps: Click to install the following html5 apps:
Huge markdown file viewer Huge markdown file viewer
Huge markdown+katex file viewer (Tex formulas)
Huge markdeep file viewer (markdown, latex, diagram,graphviz etc.) Huge markdeep file viewer (markdown, latex, diagram,graphviz etc.)
plyr video player plyr video player
dplayer video player dplayer video player
@ -184,12 +185,12 @@ htmlview:https://htmlview.glitch.me/?
htmlpreview:https://htmlpreview.github.io/? htmlpreview:https://htmlpreview.github.io/?
webarchive:https://web.archive.org/web/*/ webarchive:https://web.archive.org/web/*/
archive:https://archive.is/?run=1&amp;amp;url= archive:https://archive.is/?run=1&amp;amp;url=
googlecache:http://webcache.googleusercontent.com/search?q=cache:
google by image:https://www.google.com/searchbyimage?image_url= google by image:https://www.google.com/searchbyimage?image_url=
tinyeye:https://tineye.com/search?url= tinyeye:https://tineye.com/search?url=
Yandex image:https://yandex.com/images/search?text= Yandex image:https://yandex.com/images/search?text=
Yandex by image:https://yandex.com/images/search?family=yes&amp;amp;rpt=imageview&amp;amp;url= Yandex by image:https://yandex.com/images/search?family=yes&amp;amp;rpt=imageview&amp;amp;url=
ascii2d:https://ascii2d.net/search/url/ ascii2d:https://ascii2d.net/search/url/</description>
trace.moe:https://trace.moe/?url=</description>
</item> </item>
<item> <item>

@ -80,12 +80,12 @@ htmlview:https://htmlview.glitch.me/?
htmlpreview:https://htmlpreview.github.io/? htmlpreview:https://htmlpreview.github.io/?
webarchive:https://web.archive.org/web/*/ webarchive:https://web.archive.org/web/*/
archive:https://archive.is/?run=1&amp;amp;url= archive:https://archive.is/?run=1&amp;amp;url=
googlecache:http://webcache.googleusercontent.com/search?q=cache:
google by image:https://www.google.com/searchbyimage?image_url= google by image:https://www.google.com/searchbyimage?image_url=
tinyeye:https://tineye.com/search?url= tinyeye:https://tineye.com/search?url=
Yandex image:https://yandex.com/images/search?text= Yandex image:https://yandex.com/images/search?text=
Yandex by image:https://yandex.com/images/search?family=yes&amp;amp;rpt=imageview&amp;amp;url= Yandex by image:https://yandex.com/images/search?family=yes&amp;amp;rpt=imageview&amp;amp;url=
ascii2d:https://ascii2d.net/search/url/ ascii2d:https://ascii2d.net/search/url/</description>
trace.moe:https://trace.moe/?url=</description>
</item> </item>
<item> <item>

@ -70,6 +70,7 @@
<p><a href="i:01htmlpreview:https://htmlpreview.github.io/?">htmlpreview:https://htmlpreview.github.io/?</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: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&amp;url=</a></p> <p><a href="i:01archive:https://archive.is/?run=1&url=">archive:https://archive.is/?run=1&amp;url=</a></p>
<p><a href="i:01googlecache:http://webcache.googleusercontent.com/search?q=cache:">googlecache:http://webcache.googleusercontent.com/search?q=cache:</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: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: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 image:https://yandex.com/images/search?text=">Yandex image:https://yandex.com/images/search?text=</a></p>
@ -96,13 +97,14 @@
<p><a href="i:01Send url(video):i:5ji:0mc16:">Send url(video):i:5ji:0mc16:</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: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>The following needs corresponding <a href="../html5/index.html">html5 application</a> to be installed:</p> <p>The following needs corresponding <a href="../html5/index.html">html5 application</a> to be installed:</p>
<p><a href="i:01txtview:file:///data/data/info.torapp.uweb/files/app/txtview.html?url=">txtview:file:///data/data/info.torapp.uweb/files/app/txtview.html?url=</a></p> <p><a href="i:01txtview:file:///data/user/0/info.torapp.uweb/files/app/txtview.html?url=">txtview:file:///data/user/0/info.torapp.uweb/files/app/txtview.html?url=</a></p>
<p><a href="i:01markdeep:file:///data/data/info.torapp.uweb/files/app/markdeep.html?url=">markdeep:file:///data/data/info.torapp.uweb/files/app/markdeep.html?url=</a></p> <p><a href="i:01mdkatex:file:///data/user/0/info.torapp.uweb/files/app/mdkatex.html?url=">mdkatex:file:///data/user/0/info.torapp.uweb/files/app/mdkatex.html?url=</a></p>
<p><a href="i:01plyr:file:///data/data/info.torapp.uweb/files/app/plyr.html?u=">plyr:file:///data/data/info.torapp.uweb/files/app/plyr.html?u=</a></p> <p><a href="i:01markdeep:file:///data/user/0/info.torapp.uweb/files/app/markdeep.html?url=">markdeep:file:///data/user/0/info.torapp.uweb/files/app/markdeep.html?url=</a></p>
<p><a href="i:01dplayer:file:///data/data/info.torapp.uweb/files/app/dplayer.html?u=">dplayer:file:///data/data/info.torapp.uweb/files/app/dplayer.html?u=</a></p> <p><a href="i:01plyr:file:///data/user/0/info.torapp.uweb/files/app/plyr.html?u=">plyr:file:///data/user/0/info.torapp.uweb/files/app/plyr.html?u=</a></p>
<p><a href="i:01pdf:file:///data/data/info.torapp.uweb/files/app/pdfviewer.html?file=">pdf:file:///data/data/info.torapp.uweb/files/app/pdfviewer.html?file=</a></p> <p><a href="i:01dplayer:file:///data/user/0/info.torapp.uweb/files/app/dplayer.html?u=">dplayer:file:///data/user/0/info.torapp.uweb/files/app/dplayer.html?u=</a></p>
<p><a href="i:01epub:file:///data/data/info.torapp.uweb/files/app/epub.html?u=">epub:file:///data/data/info.torapp.uweb/files/app/epub.html?u=</a></p> <p><a href="i:01pdf:file:///data/user/0/info.torapp.uweb/files/app/pdfviewer.html?file=">pdf:file:///data/user/0/info.torapp.uweb/files/app/pdfviewer.html?file=</a></p>
<p><a href="i:01djvu:file:///data/data/info.torapp.uweb/files/app/djvu.html?url=">djvu:file:///data/data/info.torapp.uweb/files/app/djvu.html?url=</a></p> <p><a href="i:01epub:file:///data/user/0/info.torapp.uweb/files/app/epub.html?u=">epub:file:///data/user/0/info.torapp.uweb/files/app/epub.html?u=</a></p>
<p><a href="i:01djvu:file:///data/user/0/info.torapp.uweb/files/app/djvu.html?url=">djvu:file:///data/user/0/info.torapp.uweb/files/app/djvu.html?url=</a></p>
</div> </div>

@ -122,6 +122,7 @@ Android TV可利用顺序搜索使用箭头按钮切换频道。顺序搜索引
<guid>/zh/bookmark/</guid> <guid>/zh/bookmark/</guid>
<description>所有书签都可通过&amp;quot;长按链接-&amp;gt;命令-&amp;gt;书签&amp;quot;保存链接为书签。书签菜单可至特色服务网页安装。 <description>所有书签都可通过&amp;quot;长按链接-&amp;gt;命令-&amp;gt;书签&amp;quot;保存链接为书签。书签菜单可至特色服务网页安装。
Personal use, not for public Personal use, not for public
Personal use 2
Wait for url from other devices Wait for url from other devices
gamezop gamezop
分类书签模板 点击以下链接可安装模板至分类书签目录。保存至“小说”类别的网站会自动使用阅读模式。 分类书签模板 点击以下链接可安装模板至分类书签目录。保存至“小说”类别的网站会自动使用阅读模式。

@ -49,6 +49,7 @@
</ul> </ul>
<p>所有书签都可通过&quot;长按链接-&gt;命令-&gt;书签&quot;保存链接为书签。书签菜单可至<a href="../urls/index.html">特色服务网页</a>安装。<br> <p>所有书签都可通过&quot;长按链接-&gt;命令-&gt;书签&quot;保存链接为书签。书签菜单可至<a href="../urls/index.html">特色服务网页</a>安装。<br>
<a href="https://s1.asytech.cn/s/JoNbk7N8K74HHNW">Personal use, not for public</a><br> <a href="https://s1.asytech.cn/s/JoNbk7N8K74HHNW">Personal use, not for public</a><br>
<a href="https://www.123pan.com/s/cKA9-HFUCA">Personal use 2</a><br>
<a href="i:1c">Wait for url from other devices</a><br> <a href="i:1c">Wait for url from other devices</a><br>
<a href="https://www.gamezop.com">gamezop</a></p> <a href="https://www.gamezop.com">gamezop</a></p>
<h3 id="分类书签模板">分类书签模板</h3> <h3 id="分类书签模板">分类书签模板</h3>

@ -301,6 +301,7 @@ Android TV可利用顺序搜索使用箭头按钮切换频道。顺序搜索引
<guid>/zh/bookmark/</guid> <guid>/zh/bookmark/</guid>
<description>所有书签都可通过&amp;quot;长按链接-&amp;gt;命令-&amp;gt;书签&amp;quot;保存链接为书签。书签菜单可至特色服务网页安装。 <description>所有书签都可通过&amp;quot;长按链接-&amp;gt;命令-&amp;gt;书签&amp;quot;保存链接为书签。书签菜单可至特色服务网页安装。
Personal use, not for public Personal use, not for public
Personal use 2
Wait for url from other devices Wait for url from other devices
gamezop gamezop
分类书签模板 点击以下链接可安装模板至分类书签目录。保存至“小说”类别的网站会自动使用阅读模式。 分类书签模板 点击以下链接可安装模板至分类书签目录。保存至“小说”类别的网站会自动使用阅读模式。

@ -2,5 +2,5 @@ pdf:uweb:echo file:///sdcard/uweb/app/pdfviewer.html?file=%u#page=1
djvu:uweb:echo file:///sdcard/uweb/app/djvu.html?url=%u#page=1 djvu:uweb:echo file:///sdcard/uweb/app/djvu.html?url=%u#page=1
epub:uweb:echo file:///sdcard/uweb/app/epub.html?u=%u epub:uweb:echo file:///sdcard/uweb/app/epub.html?u=%u
txt:uweb:echo file:///sdcard/uweb/app/txtview.html?url=%u#page=1 txt:uweb:echo file:///sdcard/uweb/app/txtview.html?url=%u#page=1
md.html:uweb:echo file:///sdcard/uweb/app/markdeep.html?url=%u#page=1 md:uweb:echo file:///sdcard/uweb/app/txtview.html?url=%u#page=1
py:termux/*:python %f;exit -1 py:termux/*:python %f;exit -1

@ -22,7 +22,7 @@
} }
var file; var file;
var blocksize = 1024; var blocksize = 20480;
function loadSlice(){ function loadSlice(){
function render(u8array){ function render(u8array){
document.body.innerHTML = window.markdeep.format(new TextDecoder().decode(u8array),true); document.body.innerHTML = window.markdeep.format(new TextDecoder().decode(u8array),true);

@ -0,0 +1,152 @@
<head>
<base>
<script src="https://fastly.jsdelivr.net/npm/marked@3.0.7/marked.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/katex@0.13.11/dist/katex.min.js" crossorigin="anonymous"></script>
<script>
const renderer = new marked.Renderer();
var options = {
renderer: renderer,
pedantic: false,
gfm: true,
breaks: false,
sanitize: false,
smartLists: true,
smartypants: false,
xhtml: false
};
marked.setOptions(options);
function htmldecode(text){
var temp = document.createElement("div");
temp.innerHTML = text;
var output = temp.innerText || temp.textContent;
temp = null;
return output;
}
function mathsExpression(expr) {
if (expr.match(/^\$\$[\s\S]*\$\$$/)) {
expr = expr.substr(2, expr.length - 4);
return katex.renderToString(expr, { displayMode: true });
} else if (expr.match(/^\$[\s\S]*\$$/)) {
expr = htmldecode(expr); // temp solution
expr = expr.substr(1, expr.length - 2);
return katex.renderToString(expr, { displayMode: false });
}
}
const unchanged = new marked.Renderer()
renderer.code = function(code, lang, escaped) {
if (!lang) {
const math = mathsExpression(code);
if (math) {
return math;
}
}
return unchanged.code(code, lang, escaped);
};
renderer.codespan = function(text) {
const math = mathsExpression(text);
if (math) {
return math;
}
return unchanged.codespan(text);
};
function markedWithKatex(text) {
return marked(text, options);
}
function absFile(url) {
this.name=url;
this.slice = async(offset, length) =>{
const headers = new Headers();
headers.append('range', 'bytes=' + offset + '-' + ( offset + length -1).toString());
const opts = {
credentials: 'include',
headers : headers
};
const resp = await fetch( this.name, opts );
return await resp.arrayBuffer();
//alert(JSON.stringify(resp.headers));
//return await resp.text();
}
}
var file;
var blocksize = 20480;
function loadSlice(){
function render(u8array){
document.body.innerHTML = markedWithKatex(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));
});
}
//?url=#offset=&[len]&page=
{
let url = location.search.substring(5);
file = new absFile(url);
document.getElementsByTagName('base')[0].href=url;
}
window.addEventListener('hashchange',loadSlice);
</script>
</head>
<body>
<script>loadSlice();</script>
</body>
Loading…
Cancel
Save