3 <script src=
"https://fastly.jsdelivr.net/npm/marked@3.0.7/marked.min.js"></script>
4 <script src=
"https://cdn.jsdelivr.net/npm/katex@0.13.11/dist/katex.min.js" crossorigin=
"anonymous"></script>
6 const renderer
= new marked
.Renderer();
17 marked
.setOptions(options
);
19 function htmldecode(text
){
20 var temp
= document
.createElement("div");
21 temp
.innerHTML
= text
;
22 var output
= temp
.innerText
|| temp
.textContent
;
27 function mathsExpression(expr
) {
28 if (expr
.match(/^\$\$[\s\S]*\$\$$/)) {
29 expr
= expr
.substr(2, expr
.length
- 4);
30 return katex
.renderToString(expr
, { displayMode
: true });
31 } else if (expr
.match(/^\$[\s\S]*\$$/)) {
32 expr
= htmldecode(expr
); // temp solution
33 expr
= expr
.substr(1, expr
.length
- 2);
34 return katex
.renderToString(expr
, { displayMode
: false });
38 const unchanged
= new marked
.Renderer()
39 renderer
.code = function(code
, lang
, escaped
) {
41 const math
= mathsExpression(code
);
46 return unchanged
.code(code
, lang
, escaped
);
49 renderer
.codespan = function(text
) {
50 const math
= mathsExpression(text
);
54 return unchanged
.codespan(text
);
57 function markedWithKatex(text
) {
58 return marked(text
, options
);
61 function absFile(url
) {
63 this.slice
= async(offset
, length
) =>{
64 const headers
= new Headers();
65 headers
.append('range', 'bytes=' + offset
+ '-' + ( offset
+ length
-1).toString());
68 credentials
: 'include',
72 const resp
= await
fetch( this.name
, opts
);
73 return await resp
.arrayBuffer();
74 //alert(JSON.stringify(resp.headers));
75 //return await resp.text();
80 var blocksize
= 20480;
82 function render(u8array
){
83 document
.body
.innerHTML
= markedWithKatex(new TextDecoder().decode(u8array
));
86 function setPageUrl(pageurl
){
87 let a
= document
.createElement('a');
88 a
.href
= "i:5c"+pageurl
;
93 var extrasize
= blocksize
; //extrasize should <= blocksize
94 let lhash
= location
.hash
;
96 if("p"!==lhash
.charAt(1)){//#offset=&[len]
97 let iAmpersand
= lhash
.indexOf('&',8);
98 let offset
= parseInt(lhash
.substring(8,iAmpersand
));
99 let len
= parseInt(lhash
.substring(iAmpersand
+1));
100 {//update urlInc() url
101 let href
= location
.href
;
102 let iHash
= href
.indexOf('#');
103 href
=href
.substring(0,iHash
)+"#page="+Math
.floor((offset
+len
)/blocksize
);
106 file
.slice(offset
,len
).then((buffer
)=>{
107 let u8
= new Uint8Array(buffer
);
113 page
= parseInt(lhash
.substring(6));
115 setPageUrl(location
.href
+"#page=1");
116 file
.slice(blocksize
*(page
-1),blocksize
+extrasize
).then((buffer
)=>{
117 let u8
= new Uint8Array(buffer
);
118 let u8len
= u8
.length
;
120 let limit
= Math
.min(u8len
,extrasize
);
122 for(let i
=1;i
<limit
;i
=i
+2){
123 if(10==u8
[i
] && 10==u8
[i
-1]) {
129 let iEnd
= Math
.min(u8len
,blocksize
);
130 limit
= Math
.min(u8len
,blocksize
+extrasize
);
131 for(let i
=blocksize
+1;i
<limit
;i
=i
+2){
132 if(10==u8
[i
] && 10==u8
[i
-1]) {
137 render(u8
.slice(iStart
,iEnd
));
141 //?url=#offset=&[len]&page=
143 let url
= location
.search
.substring(5);
144 file
= new absFile(url
);
145 document
.getElementsByTagName('base')[0].href
=url
;
147 window
.addEventListener('hashchange',loadSlice
);
151 <script>loadSlice();</script>