a b/src/krang-dataset-loaders.js
1
//Branch improve-map-script, TODO:
2
//Separate loader scripts from map tools scripts
3
//Remake tools on cuts viewer to match tools in deepzoom-viewer
4
//Think about storing marker data outside the scripts (in JSON files individual for every image)
5
6
//thumbnails page
7
const thumbnailsListLink = "https://storage.yandexcloud.net/krang-dataset?list-type=2&prefix=thumbnails/"
8
const thumbnailsPattern = /[0-9a-f]{12}-preview.jpg/
9
10
async function insertThumbnails() {
11
    try {
12
        const filenames = await createList(thumbnailsListLink, thumbnailsPattern);
13
        const cutsList = await createList(cutsListLink, cutsPattern);
14
15
        let cutsIcon = (data) => {
16
            let resultText = data ? "есть фрагменты" : "нет фрагментов";
17
            resultStyle = data ? 'green' : 'lightcoral';
18
            result = {
19
                resultText,
20
                resultStyle
21
            }
22
            return result
23
        }
24
        const cardTemplate = data => `
25
        <div>
26
        <a href='deepzoom.html#${data.id}' class='preview-card' style='background-image: url(${data.url})'>
27
            <p class='slide-id'>${data.id}</p>
28
        </a>
29
        <p class='preview-info' style="color: ${cutsIcon(data.hasCuts).resultStyle};">${cutsIcon(data.hasCuts).resultText}</p>
30
        </div>`;
31
32
        $(document).ready(() => {
33
            const overviewRoot = $("#overview")
34
            list.forEach(data => overviewRoot.append(cardTemplate(data)));
35
            ;
36
        });
37
38
        let prefix = "https://krang-dataset.website.yandexcloud.net/"
39
        const list = filenames.map(filename => {
40
            return {
41
                url: prefix + filename,
42
                id: filename.slice(11, 23),
43
                hasCuts: false
44
            }
45
        })
46
        compareLists(list, cutsList)
47
    }
48
    catch (e) {
49
        document.body.insertAdjacentHTML('beforeend', `<h2 style="color: darkred">Не могу загрузить список слайдов!</h2>`)
50
        console.error("Can't load list of files: ", e);
51
    }
52
}
53
function compareLists(to, from) {
54
    for (cut of from) {
55
        cutId = cut.slice(0, 12)
56
        for (iter of to) {
57
            if (cutId == iter.id){iter.hasCuts = true}
58
        }
59
}
60
}
61
62
//cuts page
63
const cutsListLink = "https://storage.yandexcloud.net/krang-dataset?list-type=2"
64
const cutsPattern = /^[0-9a-f]{12}-cut__.*/
65
66
async function insertCuts() {
67
    try {
68
        const filenames = await createList(cutsListLink, cutsPattern);
69
        listTarget = document.getElementById("cuts_list");
70
        filenames.forEach((filename) => {
71
            const fragmentId = filename.slice(0,53);
72
            listTarget.insertAdjacentHTML('beforeend', `<li><a href="/${filename}">${fragmentId}.tiff</a> (<a href="cut.html#${fragmentId}">просмотреть</a>)</li>`)
73
        });
74
    } catch (e) {
75
        document.body.insertAdjacentHTML('beforeend', `<h2 style="color: darkred">Не могу загрузить список фрагментов!</h2>`)
76
        console.error("Can't load list of files: ", e);
77
    }
78
}
79
//general
80
function traverseXmlDoc(rootTag, maxDeepness, tagCallback, path = "") {
81
    if(!rootTag.tagName) return;
82
    var myPath = path + "." + rootTag.tagName;
83
    tagCallback(myPath, rootTag);
84
    if(maxDeepness > 0) {
85
        rootTag.childNodes.forEach((child) => {traverseXmlDoc(child, maxDeepness-1, tagCallback, myPath)})
86
    }
87
}
88
89
async function createList(link, pattern){
90
    try {
91
        let response = await fetch(link)
92
        let text = await response.text()
93
        console.log("response", response)
94
        let parser = new DOMParser()
95
        let doc = await parser.parseFromString(text, "text/xml")
96
        const filenames = []
97
        const previewPattern = pattern
98
        traverseXmlDoc(doc.documentElement, 5, (path, tag)=>{
99
            if(path == ".ListBucketResult.Contents.Key"){
100
                //console.log("filename", tag.textContent)
101
                if(previewPattern.test(tag.textContent)){
102
                    filenames.push(tag.textContent);
103
                }
104
            }
105
        });
106
        //console.log("filenames", filenames);
107
        return filenames
108
    } catch(e) {
109
        console.error("Error while loading list of previews", e)
110
        return null;
111
    }
112
}
113
114
//deepzoom page
115
// Init Leaflet
116
//bounds = {topLeft, bottomRight}
117
//var bounds = [[0, 0], [-1500, 1000]];
118
var map = L.map('map', {
119
    crs: L.CRS.Simple,
120
    //maxBounds: bounds
121
});
122
L.tileLayer('http://krang-dataset.website.yandexcloud.net/deepzoom/{id}/{z}/{y}/{x}.jpg', {
123
    id: createSlideId(),
124
    minZoom: 0,
125
    maxZoom: 8,
126
    minNativeZoom: 0,
127
    maxNativeZoom: 7,
128
    tileSize: 2048,
129
    noWrap: true,
130
    attributionControl: false,
131
    //bounds: bounds
132
}).addTo(map);
133
134
map.setView([0, 0], 0)
135
136
function createSlideId() {
137
    const slideId = document.URL.slice(-12);
138
    console.log('slideID: ' + slideId)
139
    return slideId;
140
}
141
function openDeepzoom() {
142
    let slideId = createSlideId();
143
    $(document).ready(() => {
144
        $('.slideId').append(slideId)
145
        $('#downloadslide').append(`<a href="https://krang-dataset.website.yandexcloud.net/${slideId}.tiff">Скачать слайд ${slideId}.tiff</a>`);
146
    });
147
}
148
async function insertCutsDeepzoom() {
149
    try {
150
        let slideId = createSlideId()
151
        let cutsPatternDeepzoom = new RegExp(`${slideId}-cut.*`)
152
        const filenames = await createList(cutsListLink, cutsPatternDeepzoom);
153
        let listTarget = document.getElementById("display-cuts");
154
        filenames.forEach((filename) => {
155
                listTarget.insertAdjacentHTML('beforeend', `<p>Просмотреть фрагмент: <a href="/krang-dataset-viewer/cut.html#${filename.slice(0, -5)}">${filename.slice(0, -5)}</a></p>`)
156
            });
157
        if (filenames.length == 0){listTarget.remove()}
158
    }
159
    catch (e) {
160
        console.error("Can't load list of files: ", e);
161
    }
162
}