liberty-db 0.2.2

`liberty` data structre
Documentation
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.css" integrity="sha384-vKruj+a13U8yHIkAyGgK1J3ArTLzrFGBbBc0tDp4ad/EyewESeXE/Iv67Aj8gKZ0" crossorigin="anonymous">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.js" integrity="sha384-PwRUT/YqbnEjkZO0zZxNqcxACrXe+j766U2amXcgMg5457rve2Y7I6ZJSm2A0mS4" crossorigin="anonymous"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/contrib/auto-render.min.js" integrity="sha384-+VBxd3r6XgURycqtZ117nYw44OOcIax56Z4dCRWbxyPt0Koah1uHoK0o4+/RRE05" crossorigin="anonymous"></script>
<script>
    // katex https://katex.org/docs/autorender.html
    document.addEventListener('DOMContentLoaded', function() {
        renderMathInElement(document.body, {
          delimiters: [
              {left: '$$', right: '$$', display: true},
              {left: '\\(', right: '\\)', display: false},
              {left: '$', right: '$', display: false},
              {left: '\\[', right: '\\]', display: true}
          ],
          throwOnError : false
        });
    });
</script>
<script>
    function IFRAME(DEFALUT_URL = 'https://zao111222333.github.io/liberty-db/2020.09/reference_manual.html'){
        let iframeElement=document.getElementById('pdf_iframe');
        const LINK_NAME = 'reference_link';
        if (iframeElement==null){
            window.onload=function(){
                let mouseDown = false;
                document.body.onmousedown = function() { 
                    mouseDown = true;
                }
                document.body.onmouseup = function() {
                    mouseDown = false;
                }
                let isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
                let switchFuncList = [];
                let activeLinkIndex = 0;
                let linkElementList = [];
                let linkList = [];
                Object.defineProperty(this, 'linkIndexWatch', {
                    get: function () { return activeLinkIndex; },
                    set: function (v) {
                    linkElementList[activeLinkIndex].style.color = 'var(--link-color)';
                    activeLinkIndex = v;
                    linkElementList[activeLinkIndex].style.color = 'var(--type-link-color)';
                    iframeElement.contentWindow.postMessage(linkList[activeLinkIndex][1],'*');
                    iframeElement.addEventListener('load', function() {
                        iframeElement.contentWindow.postMessage(linkList[activeLinkIndex][1],'*');
                    });
                    }
                });
                
                const BORDER_SIZE = 4;
                const BORDER_DEF_COLOR = 'rgba(55,125,206,0)';
                const BORDER_ACT_COLOR = 'rgb(55,125,206)';
                const main = document.getElementsByTagName('main')[0];
                main.style.minWidth = '400px';
                iframeElement = document.createElement('iframe');
                let iframeNav = document.createElement('nav');
                iframeNav.style.display='flex';
                if (isMobile){
                    iframeNav.style.position = 'fixed';
                    iframeNav.style.height = '40vh';
                    iframeNav.style.bottom = '0';
                    iframeNav.style.width = '100vw';
                    main.style.paddingBottom = '42vh';
                }else{
                    let navHight = getComputedStyle(document.getElementsByClassName('sidebar')[0]).top;
                    iframeNav.style.position = 'sticky';
                    iframeNav.style.height = 'calc(100vh - '+navHight+')';
                    iframeNav.style.top = navHight;
                    iframeNav.style.width = '615px';
                    iframeNav.style.minWidth = '300px';
                    iframeNav.style.flexDirection='row';
                }
                iframeElement.id = 'pdf_iframe';
                iframeElement.style.width = '100%';
                iframeElement.style.height = '100%';
                iframeElement.style.border = 'none';
                iframeElement.style.marginRight = '0px';
                iframeElement.setAttribute('allow', 'clipboard-write');
                let resizeBar = document.createElement('div');
                resizeBar.style.height = '100%';
                resizeBar.style.marginLeft = -BORDER_SIZE+'px';
                resizeBar.style.marginRight = -BORDER_SIZE+'px';
                resizeBar.style.backgroundColor = BORDER_DEF_COLOR;
                resizeBar.style.width = 2*BORDER_SIZE+'px';
                resizeBar.style.minWidth = 2*BORDER_SIZE+'px';
                resizeBar.style.zIndex = '100';
                resizeBar.style.cursor='col-resize';
                main.after(iframeNav);
                iframeNav.appendChild(resizeBar);
                iframeNav.appendChild(iframeElement);

                // resize
                let m_pos;
                function resize(e){
                    const dx = m_pos - e.x;
                    m_pos = e.x;
                    if (dx>0){
                        main.style.width = (parseInt(getComputedStyle(main, '').width) - dx) + 'px';
                    }
                    iframeNav.style.width = (parseInt(getComputedStyle(iframeNav, '').width) + dx) + 'px';
                    let mainStyle = getComputedStyle(main, '')
                    let iframeStyle = getComputedStyle(iframeNav, '')
                    let seted = false;
                    if (!seted&&(parseInt(mainStyle.width)<=parseInt(mainStyle.minWidth))){
                        document.body.style.cursor='e-resize';
                        seted = true;
                    }
                    if (!seted&&(parseInt(iframeStyle.width)<=parseInt(iframeStyle.minWidth))){
                        document.body.style.cursor='w-resize';
                        seted = true;
                    }
                    if (!seted){
                        document.body.style.cursor='col-resize';
                    }
                }
                resizeBar.addEventListener('mouseover', (event) => {
                    resizeBar.style.backgroundColor = BORDER_ACT_COLOR;
                    resizeBar.style.width =  2*BORDER_SIZE+'px';
                });
                resizeBar.addEventListener('mouseleave', (event) => {
                    if (!mouseDown){
                        resizeBar.style.backgroundColor = BORDER_DEF_COLOR;
                        resizeBar.style.width = BORDER_SIZE+'px';
                    }
                });
                resizeBar.addEventListener('mousedown', function(e){
                    iframeElement.style.pointerEvents='none';
                    main.style.userSelect='none';
                    m_pos = e.x;
                    document.addEventListener('mousemove', resize, false);
                }, false);
                
                document.addEventListener('mouseup', function(){
                    resizeBar.style.width = BORDER_SIZE+'px';
                    iframeElement.style.pointerEvents='auto';
                    document.body.style.cursor='';
                    main.style.userSelect='';
                    resizeBar.style.backgroundColor = BORDER_DEF_COLOR;
                    document.removeEventListener('mousemove', resize, false);
                }, false);
                // }
                linkElementList=document.getElementsByName(LINK_NAME);
                for (let index = 0; index < linkElementList.length; index++) {
                    let linkUrl = new URL(linkElementList[index].href);
                    let linkSearch = linkUrl.search;
                    linkUrl.search='';
                    linkList.push([linkUrl.toString(),linkSearch]);
                    linkElementList[index].removeAttribute('href');
                    linkElementList[index].style.cursor = 'pointer';
                    switchFuncList.push(function(){
                        linkIndexWatch = index;
                        if (iframeElement.src != linkList[index][0]){
                            iframeElement.src = linkList[index][0];
                        }
                    });
                    linkElementList[index].addEventListener('click', switchFuncList[index]);
                    let content = linkElementList[index].parentElement.cloneNode(true)
                    while (content.children[0]) {
                        content.removeChild(content.children[0]);
                    }
                    if ((content.textContent==''||content.textContent==' '||content.textContent=='\n')
                        &&(linkElementList[index].parentElement.previousElementSibling!=null)
                        &&(linkElementList[index].previousElementSibling==null)){
                        linkElementList[index].innerHTML = 'Reveal in '+linkElementList[index].innerHTML;
                    }else{
                        linkElementList[index].innerHTML = '<br>Reveal in '+linkElementList[index].innerHTML;
                    }
                    linkElementList[index].style.textDecoration = 'underline';
                }
                if (switchFuncList.length!=0){
                    iframeElement.src = linkList[0][0];
                    switchFuncList[0]();
                }else{
                    iframeElement.src = DEFALUT_URL;
                }
            }
        }
    }
</script>